2012-07-01 15 views
11

Dużo czasu poświęcono na rozwiązanie problemu i wygląda na łatwe, ale jestem bardzo zmęczony i nie mogłem znaleźć rozwiązania. Mam aktywność, aktywność ma 4 komponenty EditText, 2 z nich ma wyskakujące menu (AlertDialog), które zawiera listę, następna - jest wyłączona dla edycji, a ostatnia - jest edytowalna i powinna pokazywać klawiaturę, kiedy użytkownik dotyka go.requestFocus nie działa poprawnie w EditText

Ponadto, mój root LinearLayout ma LinearLayout, który zawiera wewnątrz RelativeLayout. Ostatnia z nich to AdvBanner. Last LinearLayout (RelativeLayout) jest wyrównany do dolnej części układu głównego.

Część XML, który opisuje go:

<LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_gravity="bottom" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:gravity="bottom"> 
    <RelativeLayout 
     android:id="@+id/AdvLayoutReserveArea" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:background="#FFFFFF" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:gravity="bottom" /> 
    </LinearLayout> 

Kiedy działalność jest zacząć, edycji EditText ma ostrość GREEN granicy i kursor miga. Po kilku sekundach AdvBanner zostaje załadowany i pokazany. Kiedy to się dzieje, Editable EditText stracił ostrość ... od tego momentu moje życie będzie jak koszmar.

Spójrzmy krok po kroku.

Zadanie 1. Jeśli w tej chwili (Adv gdy załadowany i pojawia) użytkownik edytuje pole EditText za pomocą miękkiej klawiatury, ostrość jest stracone, granica wziąć GREY kolor, a jeśli użytkownik nadal pisanie tekstu nie przynosi rezultatów - symbole nie są drukowane (CURSOR w EditText jest zbyt zagubiony).

Uważam, że każdy użytkownik będzie denerwował się - podczas pisania tekstu kursor jest nieaktywny, ponieważ w tle jest ładowany jakiś adv i skupia się on na sobie.

Aby rozwiązać ten problem, w metodzie, gdy Adv jest ładowany (jest pokazany), staram się ręcznie skupić się na EditText metodą requestFocus.

public void onAdLoaded() 
    { 
// TODO Auto-generated method stub 
// add app specific code for this event here... 
// called when an ad is successfully displayed on device    
    CountEdit1.requestFocus(); 
} 

Tak, kursor powraca do pola EditText, a jeśli klawiatura jest aktywna, użytkownik nadal może wpisywać tekst, ale granica pola EditText pobyt GRAY ...

UWAGA: właściwie, nie jestem pewna różnicy między ZIELONĄ i SZARE granicą ostrego EditText .. ZIELONY jest zwykle wtedy, gdy użytkownik dotyka go, a SZARY, prawdopodobnie, gdy chcemy ręcznie poprosić o skupienie (za pomocą requestFocus() itp.)

Problem 2. (W wyniku solwatacji Probl em # 1). Po zamknięciu miękkiej klawiatury, jeśli użytkownik stuknie w edytowalne pole EditText, przyjmuje ostrość, a wewnątrz pojawia się kursor, ale nie ma reakcji na ponowne wyświetlenie miękkiej klawiatury! Dotknięcie nie pokazuje miękkiej klawiatury, ale wygląda jak pole edycji w trybie kopiowania - kiedy użytkownik może wybrać tekst i wyciąć/skopiować go do schowka.

Mój cel jest łatwy do pierwszego spojrzenia. Chcę tylko ZACHOWAĆ kursor i ustawić ostrość na edytowalne pole EditText (CountEdit1), gdy wyświetlana jest klawiatura ekranowa i użytkownik wpisuje tekst. I normalna reakcja, gdy użytkownik dotyka EditText - jak zwykle po prostu pokaż mi miękką klawiaturę!

Przeczytałem wszystkie problemy tutaj, połączyłem różne metody (clearFocus, requestFocusFromTouch itp.), Po prostu za mało czasu i miejsca, aby opisać wszystko, co próbowałem zrobić, aby rozwiązać ten problem.Główne problemy zostały opisane powyżej.

Nadzieja na pomoc i rozwiązanie problemu ... Z góry dzięki ..

Odpowiedz

13

Cel został rozwiązany, obejście problemu jest łatwiejsze niż myślałem. Problem nr 2 jest naprawiony za pomocą metody onClick(). Wystarczający warunek pojawiania się miękkiej klawiatury wykorzystującej obie metody clearFocus() i requestFocus().

CountEdit1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) 
     { 
       CountEdit1.clearFocus(); 
     CountEdit1.requestFocus(); 
     } 
    }); 

miękka klawiatura pojawia się, gdy użytkownik jest stukanie w dziedzinie EditText. Naprawiono.

4
userInput.post(new Runnable() { 
      public void run() { 
       userIdInput.requestFocus(); 

      } 
     }); 

mieć go na to i powiedzieć, czy problem nadal jest nierozwiązany.

+0

Dzięki, ale ten kod nie Rozwiąż problem. Wcześniej grałem też z tym samym kodem. Wrzuciłem go do mojej klasy aktywności, ale wciąż nie mam postępu. Oprócz głównego opisu mam 2 sposoby na połowiczne rozwiązywanie: 1) jeśli usunę CountEdit1.requestFocus(); z publicznej pustki onAdLoaded(), wtedy Soft Keyboard pojawia się, jeśli użytkownik stuknął w EditText nawet po załadowaniu Adv, ALE .. jeśli Adv załadowano podczas softkeyboard, użytkownik stracił kursor w polu EditText i nie mógł kontynuować wprowadzania tekstu. – Dimon

+0

2) z CountEdit1.requestFocus(); w onAdLoaded(), użytkownik jest w stanie kontynuować edycję pola po wczytaniu Adv, ale po zamknięciu Softkeyboard, kolejne kliknięcie przez EditText nie pokazuje ponownie miękkiej klawiatury! Ta sytuacja mnie tak bardzo zmęczyła. – Dimon

+0

Czy nie chcesz też ręcznie wyświetlać miękkiej klawiatury, jeśli nie pojawia się ona sama? – Swayam

7

roboty dla mnie:

InputMethodManager mgr = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
editField.requestFocus(); 
mgr.showSoftInput(editField, InputMethodManager.SHOW_IMPLICIT); 
0

Należy zwrócić ostrość po widok jest tworzony w fragmentu lub działalności:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    CountEdit1.requestFocus(); 
} 
0

spróbuj tego:

public void onAdLoaded() 
    { 
    final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        CountEdit1.requestFocus(); 
        InputMethodManager mgr = (InputMethodManager) base.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        mgr.showSoftInput(CountEdit1, InputMethodManager.SHOW_IMPLICIT); 
        CountEdit1.setSelection(CountEdit1.getText().length()); 
       } 
      },0); 
}