2012-07-17 9 views
5

EDYCJA: Rozwiązany. Odpowiedź wysłana osobno poniżej:Klawiatura systemu Android jest nadal widoczna po uruchomieniu zamiaru wiadomości e-mail

Uruchamiam wbudowany selektor "Intent.ACTION_SEND", dzięki czemu użytkownik może wybrać sposób wysłania wiadomości z mojej aplikacji. Działa poprawnie, ale jeśli kliknę przycisk "Odrzuć" w uruchomionym programie e-mail, wróci do mojej aplikacji z nadal widoczną klawiaturą ekranową. Próbowałem zamknąć go z różnych zaklęć imm.hideSoftInputFromWindow (...), ale bez skutku. Wszelkie pomysły, jak to naprawić?

W ten sposób uruchamiam 'selektor' i próbuję zamknąć klawiaturę w onActivityResult(). Zauważ, że tabHost jest statycznym elementem w mojej głównej aplikacji (MainApp), która przechowuje obiekt tabHost używany do tworzenia tabSpecs.

public class L_Secondary extends ListActivity implements myConst 
{ 
    @Override 
    protected void onCreate (Bundle savedInstanceState) 
    { 
    super.onCreate (savedInstanceState); 
    setContentView(R.layout.l_people_secondary); 

    // instantiate the custom array adapter class and pass it some info to build a ListView with. 
    ListView lv = getListView(); 
    lv.setOnItemClickListener (oicl); 
    A_secondary da = new A_secondary (this, android.R.layout.simple_list_item_single_choice, mPiecesArray, mPartsArray); 

    setListAdapter (da); 
    } 

    ... 


    // after launching the email client, the keyboard stays visible 
    // over the Listview. Currently the keyboard gets forced to close 
    // in getView() of the ArrayAdapter class da, in onCreate() above     
    public void launchEmail() 
    { 
    try 
    { 
    // use the builtin chooser for users mail app 
    Intent sendIntent = new Intent(Intent.ACTION_SEND, Uri.fromParts ("mailto", "[email protected]", null)); 
    sendIntent.setType("text/plain");  

    sendIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "msg_subject"); 
    sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, "msg_body"); 

    startActivityForResult (Intent.createChooser(sendIntent, "Send via which Application?"), 0); 
    } 
    catch (Exception e) 
    { 
    Toast.makeText (this, "No activity was found to handle this action",Toast.LENGTH_SHORT).show(); 
    } 
    } 

... 

} 

Odpowiedz

0

skończyło się używając kontekstu przekazany do getView() w klasie ArrayAdapter który jest tworzony w klasie L_Secondary. Nie jest to najlepsze miejsce, ponieważ za każdym razem, gdy lista jest przewijana, dotykana lub przenoszona, sprawdza się, czy klawiatura jest widoczna i zamyka ją, jeśli tak. Niemniej jednak jest to początek. Stąd mogę spróbować znaleźć bardziej wydajne miejsce, w którym można to wyrazić.

@Override 
public View getView (int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 
    Context ctx = parent.getContext(); 

    if (row == null) 
    { 
     LayoutInflater inflater = ((Activity) ctx).getLayoutInflater(); 
     row = inflater.inflate (R.layout.li_secondary, parent, false); 
    } 

    // hide the keyboard when coming back from Email client Intent 
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    if (imm.isActive() == true) 
     imm.hideSoftInputFromWindow (MainApp.tabHost.getCurrentTabView().getApplicationWindowToken(),imm.HIDE_NOT_ALWAYS); 
    ... 
} 
+0

Dlaczego to działa?Muszę zrozumieć, aby spróbować go użyć w mojej sytuacji. – Poutrathor

0

użyć tego kodu przed wywołaniem intencji MAIL // Ed EditText

InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE); 

do ukrywania klawiatury

imm.hideSoftInputFromWindow(ed.getWindowToken(), 0); 

na pokaz klawiaturze

imm.showSoftInput(ed, 0); 

try to Kod na metodzie onRestart(), a także

LUB

można spróbować tego jak dobrze

<activity android:name=".YourActivity" 
      android:windowSoftInputMode="stateHidden"></activity> 

Dzięki.

+0

chciałbym spróbować tego, ale ja nie mam EditText w moim ListView. Będę eksperymentować, dziękuję. – wufoo

+0

Zmodyfikowałem swój kod, aby uzyskać jeszcze jedno rozwiązanie, jeśli nie masz żadnego edytowanego tekstu na liście. Dzięki – SALMAN

+0

Dziękuję. Mam zestaw stateHidden, ale wciąż nie ma szczęścia. – wufoo

0

wierzę, można wywołać metodę hideSoftInputFromWindow w onResume()

protected void onResume() 
{ 
    InputMethodManager keyboard = (InputMethodManager) 
    getSystemService(Context.INPUT_METHOD_SERVICE); 
    keyboard.hideSoftInputFromWindow(userInput.getWindowToken(), 0); 
} 
+0

Dlaczego jest to odrzucane? – Leon

+0

Nie jestem pewien, ale jeśli robię coś nie tak, proszę dać mi znać –

+0

co to jest userInput? –

2

znalazłem ten pracował dla mnie przez dodanie go do mojego onResume()

protected void onResume() 
{ 
    Handler h = new Handler(); 
    h.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     keyboard.hideSoftInputFromWindow(findViewById(android.R.id.content).getWindowToken(), 0); 
    } 
    }, 500); 
} 
+0

Jedyną rzeczą, która działała ... – peresisUser

+0

Możesz również napisać to w onActivityResult() zamiast onResume(). –

Powiązane problemy