2017-05-16 1 views
1

Ich versuche, den Text bearbeiten verloren Fokus, wenn etwas außerhalb der Text bearbeiten berührt. Hier ist mein Layout xml:Android bearbeiten Text nicht verlieren Fokus, wenn klicken Sie außerhalb der Textansicht

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/White" 
android:orientation="vertical" 
android:padding="16dp" 
android:focusable="true" 
android:focusableInTouchMode ="true"> 

<EditText 
    android:id="@+id/editCatTitle" 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" 
    android:hint="Enter name" 
    android:textSize="18dp"/> 

<GridView 
    android:id="@+id/gridViewColor" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="15dp" 
    android:columnWidth="100dp" 
    android:gravity="center" 
    android:numColumns="6" 
    android:stretchMode="columnWidth" 
    android:listSelector="@color/White"></GridView> 

<GridView 
    android:id="@+id/gridViewIcon" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="15dp" 
    android:columnWidth="100dp" 
    android:gravity="center" 
    android:numColumns="6" 
    android:stretchMode="columnWidth" 
    android:listSelector="@color/White"></GridView> 

</LinearLayout> 

In meinem onCreate:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.activity_create,container,false); 
    et = (EditText) v.findViewById(R.id.editCatTitle); 
    et.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(!hasFocus){ 
       // lost focus do something here 
      } 
     } 
    }); 
} 

stelle ich die äußere meisten Linear Layout fokussierbarem bereits sein. Wenn ich jedoch außerhalb des Bearbeitungstextes klicke, wird der Fokus immer noch nicht verloren gehen. Irgendwelche Ideen?

Ich fand das online, aber ich weiß nicht, wo ich es hinstellen sollte. Ist es innerhalb onCreate() der Ansicht oder?

@Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
    if (mEditText.isFocused()) { 
     Rect outRect = new Rect(); 
     mEditText.getGlobalVisibleRect(outRect); 
     if (!outRect.contains((int)event.getRawX(),(int)event.getRawY())) { 
      mEditText.clearFocus(); 
      // 
      // Hide keyboard 
      // 
      InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
     } 
     } 
    } 
return super.dispatchTouchEvent(event); 
} 

Antwort

1

einen Hauch Hörer-Layout für Ihre Wurzel implementieren und

public class SampleFragment extends Fragment { 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) { 
       View view = inflater.inflate(R.layout.frag_layout, container, false); 
       view.setOnTouchListener(new View.OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         et.clearFocus(); 
         return true; 
        } 
       }); 
       return view; 
     } 

    } 
+0

Ich habe die Frage aktualisiert, aber ich bin mir nicht sicher, wo der On-Touch-Listener überschrieben werden soll – hyperfkcb

+0

Überschreiben Sie einfach "dispatchTouchEvent" in Ihrer Aktivität. Genau wie Sie onCreate() überschreiben. Meine Antwort wurde aktualisiert. – Mahesh

+0

Aber es sagte mir, Methode überschreibt nicht Methode von seiner Oberklasse. Übrigens erstreckt sich mein Fragment von Fragment – hyperfkcb

0
FrameLayout touchInterceptor = (FrameLayout)findViewById(R.id.touchInterceptor);touchInterceptor.setOnTouchListener(new OnTouchListener() { 
@Override 
public boolean onTouch(View v, MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     if (mEditText.isFocused()) { 
      Rect outRect = new Rect(); 
      mEditText.getGlobalVisibleRect(outRect); 
      if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) { 
       mEditText.clearFocus(); 
       InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
      } 
     } 
    } 
    return false; 
}}); 

Dieser Code Versuchen Sie rufen, Dies funktioniert.

Verwandte Themen