2010-10-08 13 views
47

Powiel możliwe:
Stop EditText from gaining focus at Activity startup?Jak usunąć ostrość od pojedynczego EditText

W mojej aplikacji mam pojedynczy EditText razem z jakimś TextView, przycisku i pokrętła. Mój EditText jest skupiony, ponieważ uważam, że jest to jedyny możliwy do skupienia widok w tym działaniu. Mój EditText pokazuje pomarańczową ramkę i kursor na polu.
Teraz chciałbym usunąć fokus z tego pola (nie chcę, aby kursor i ramka były wyświetlane). Czy jest jakiś sposób na zrobienie tego?
Byłem w stanie skupić się na przycisku, wykonując button.seFocusableInTouchMode() i button.requestFocus(). Ale to podkreśla przycisk i oczywiście nie jest to, czego chcę.

+8

W rzeczywistości nie jest duplikatem. Pytanie to polega na zapobieganiu koncentracji EditText na uruchamianiu aktywności. Ten dotyczy usuwania ostrości. To są różne problemy. –

Odpowiedz

23

sprawdź to pytanie i wybraną odpowiedź: Stop EditText from gaining focus at Activity startup Jest brzydki, ale działa, i o ile wiem, nie ma lepszego rozwiązania.

+4

Dzięki, nie widziałem tego. Moja EditText został owinięty w TableLayout, więc to robi: rozwiązał problem dla mnie. – tobbenb3

+0

świetnie, to naprawdę brzydki problem, a rozwiązanie nie jest wcale intuicyjne. – Maragues

+1

Podobnie jak wiele innych w wygórowanym Androidzie API, i piszę to w 2013. – sebrock

41

Czy spróbujesz użyć starego dobrego View.clearFocus()

+2

Nie działa dla mnie. Wywołanie go w trybie onCreate, ale EditText utrzymuje kursor z obramowaniem i miganiem. – Ixx

+0

to samo dla mnie nie działa –

+1

Użyłem tej metody i dodałem OnFocusChangeListener, a fokus został wyczyszczony, a następnie ustawiony (automatycznie) ponownie. –

2

pomocą dołączonego kodu, aby dać nacisk na „kogoś innego”, to jest OK, jeśli masz widok gdzie chcesz po prostu schować klawiaturę i zwolnić nacisk , nie obchodzi cię, kto to dostanie.

Zastosowanie tak: FocusHelper.releaseFocus (viewToReleaseFocusFrom)

public class FocusHelper { 
    public static void releaseFocus(View view) { 
     ViewParent parent = view.getParent(); 
     ViewGroup group = null; 
     View child = null; 
     while (parent != null) { 
      if (parent instanceof ViewGroup) { 
       group = (ViewGroup) parent; 
       for (int i = 0; i < group.getChildCount(); i++) { 
        child = group.getChildAt(i); 
        if(child != view && child.isFocusable()) 
         child.requestFocus(); 
       } 
      } 
      parent = parent.getParent(); 
     } 
    } 
} 

Doc: Sposób przechodzi z punktu widzenia dziecka i do widoku drzewa i wygląda na pierwsze dziecko do Uaktywnienie.

Edit: Można również użyć do tego API:

View focusableView = v.focusSearch(View.FOCUS_DOWN); 
if(focusableView != null) focusableView.requestFocus(); 
25

nowy Android .. próbował

getWindow().getDecorView().clearFocus(); 

to działa dla mnie .. uprzejmie mnie poprawić jeśli coś jest nie tak :)

aby dodać .. układ powinien mieć:

android:focusable="true" 
android:focusableInTouchMode="true" 
+0

To działało dla mnie! – GFPF

3

Wiem, że jest za późno, ale dla kogoś odrobinę tego samego potrzeba editText.setFocusable (false) si, czego szukasz.

0

Wystarczy włączyć tę linię

android:selectAllOnFocus="false" 

w segmencie XML odpowiada układ EditText.

2

Miałem podobny problem z tekstem editText, który uzyskał fokus od rozpoczęcia aktywności. Ten problem mam stałe łatwo tak:

dodać ten kawałek kodu w układzie zawierającym EditText w XML:

android:id="@+id/linearlayout" 
    android:focusableInTouchMode="true" 

nie zapomnieć android:id, bez niego mam błąd.

Innym problemem, jaki miałem z editText, jest to, że gdy tylko uzyska pierwsze skupienie, ostrość nigdy nie zniknie. Jest to kawałek mojego kodu w Javie, ma EditText i przycisk, który przechwytuje tekst w EditText:

editText=(EditText) findViewById(R.id.et1); 
    tvhome= (TextView)findViewById(R.id.tv_home); 
    etBtn= (Button) findViewById(R.id.btn_homeadd); 
    etBtn.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      tvhome.setText(editText.getText().toString()); 

      //** this code is for hiding the keyboard after pressing the button 
      View view = Settings.this.getCurrentFocus(); 
      if (view != null) 
      { 
       InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
      } 
      //** 

      editText.getText().clear();//clears the text 
      editText.setFocusable(false);//disables the focus of the editText 
      Log.i("onCreate().Button.onClickListener()", "et.isfocused= "+editText.isFocused()); 
     } 
    }); 
    editText.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      if(v.getId() == R.id.et1) 
      { 
       v.setFocusableInTouchMode(true);// when the editText is clicked it will gain focus again 

       //** this code is for enabling the keyboard at the first click on the editText 
       if(v.isFocused())//the code is optional, because at the second click the keyboard shows by itself 
       { 
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT); 
       } 
       //** 

       Log.i("onCreate().EditText.onClickListener()", "et.isfocused= "+v.isFocused()); 
      } 
      else 
       Log.i("onCreate().EditText.onClickListener()", "the listener did'nt consume the event"); 
     } 
    }); 

nadzieję, że przyczyni się do niektórych z was!

0

Jeśli dobrze rozumiem Twoje pytanie, to powinno pomóc:

TextView tv1 = (TextView) findViewById(R.id.tv1); 
tv1 .setFocusable(false); 
0

Trzeba tylko usunąć zaznaczenie z widokiem jak

EditText.clearFocus() 
0

Ponieważ byłem w widgecie, a nie w działalność, którą wykonałem:

`getRootView(). clearFocus();

2

Po prostu znajdź inny widok i zamiast niego ustaw ostrość.

var refresher = FindViewById<MvxSwipeRefreshLayout>(Resource.Id.refresher); 

refresher.RequestFocus(); 
+0

Z jakiegoś powodu było to dla mnie najlepsze rozwiązanie. Po prostu proszę o skupienie się na układzie liniowym, aby mój tekst do edycji stracił ostrość –

2

postaram się wyjaśnić, w jaki sposób usunąć ostrość (migający kursor) z widokiem EditText z trochę więcej szczegółów i zrozumienia. Zazwyczaj ta linia kodu powinna działać

editText.clearFocus() 

ale może to być sytuacja, gdy EditText wciąż ma fokus, a to się dzieje, ponieważ metoda clearFocus() próbuje ustawić ostrość z powrotem do pierwszej zmianę ostrości widzenia w układzie aktywności/fragmentu.

Jeśli masz tylko jeden widok w aktywności, którą można ustawić, i zazwyczaj będzie to twój widok EditText, wtedy clearFocus() ponownie ustawi ostrość na ten widok, a dla ciebie będzie wyglądać tak wyraźnieFocus() nie działa. Pamiętaj, że widoki EditText mogą być ustawiane domyślnie (true), więc jeśli masz tylko jeden widok EditText w swoim layoucie, nie będzie on mógł skupić się na ekranie. W tym przypadku rozwiązanie będzie znalezienie widoku macierzystego (jakiś układ, ex LinearLayout, Framelayout) wewnątrz pliku układu i ustawione na niej ten kod XML

android:focusable="true" 
android:focusableInTouchMode="true" 

Po że podczas wykonywania editText.clearFocus() z widok rodzica wewnątrz twojego układu zaakceptuje fokus, a twój editText będzie nieostry.

Mam nadzieję, że to pomoże komuś zrozumieć, jak działa clearFocus().

1

Próbowałem wiele, aby usunąć ostrość tekstu edycji. clearfocus() i focusable i inne rzeczy nigdy nie działały dla mnie. Więc wpadłem na pomysł pozwalając fałszywego wzmocnienia EditText ostrości:

<LinearLayout 
    ... 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     ... 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <!--here comes your stuff--> 

    </LinearLayout> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/fake" 
     android:textSize="1sp"/> 

</LinearLayout> 

następnie w kodzie Java:

View view = Activity.this.getCurrentFocus(); 
        if (view != null) { 
         InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
         imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
         fake.requestFocus(); 
        } 

będzie ukryć klawiaturę i usunięcia ostrość dowolnego EditText który ma to. a także, jak widzisz, fałszywy edittext jest poza ekranem i nie można go zobaczyć

Powiązane problemy