1

我正在使用支持庫處理片段和嵌套片段。我無法在Android上隱藏虛擬鍵盤

我有一個場景,我從現有的片段中添加一個新的片段(其中包含一個EditText)。當用戶點擊EditText時,會顯示一個虛擬鍵盤。但是,當鍵盤打開時,用戶可以從ActionBar按下主頁按鈕,從堆棧中刪除片段,但鍵盤仍然保持打開狀態。我無法在鍵盤上強行關閉,我嘗試了所有代碼片段。鑑於描述的情況,任何人都可以指導我如何解決這個問題?

編輯:我做了一個回調函數,我從片段onDestroy調用。它承載的所有片段在MainActivity實現這個回調:

@Override 
public void onHideSoftKeyboard(EditText editText) { 
    // HIDE SOFT KEYBOARD HERE 

final InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); 

    Toast.makeText(this,"KEYBOARD HIDDEN",Toast.LENGTH_LONG).show(); 
} 

我得到的吐司消息和片段上的後退按鈕被破壞(動作條後退按鈕),鍵盤上的按鍵仍然存在。

@Override 
public void onDestroy() { 
    hideSoftKeyboard.onHideSoftKeyboard(editTextComment); 



    super.onDestroy(); 
} 
+0

請檢查我的答案[在此堆棧溢出線程](http://stackoverflow.com/a/23934639/1773155)。這是對我有用的唯一方式。 –

回答

1

您可以使用以下代碼。

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); 
} 
10

試圖迫使鍵盤這樣的:

InputMethodManager imm = (InputMethodManager)getSystemService(
    Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 

也可以是這樣的:

imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 

如果你想隱藏當向上主頁按鈕,用戶點擊,嘗試像這樣在onOptionsItemSelected方法中:

case android.R.id.home: 
    // count the active fragment 
    if(getSupportFragmentManager().getStackBackEntryCount() > 0) { 
     // hide soft method as above 
     InputMethodManager mImm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); 
     mImm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 
     // do the pop backstack 
     getSupportFragmentManager().popBackStack(); 
    } else { 
     // some stuff like finish the activity 
    } 
    return true; 
// other items... 

當您使用(覆蓋)onBackPressed方法時,您可以對後退按鈕執行相同操作。

+0

我已經嘗試把這個片段(與我的EditText的引用)在片段的onDestroy,但鍵盤仍然存在:( –

+0

@SpeedDemon你可以告訴我們你的代碼,你試過嗎? –

+0

@Prince,我編輯了文本,謝謝 –

0

我解決了這個問題,下一個解決方案

你需要從BaseFragment每次你的片段延長如下:

public class BaseFragment extends Fragment { 

    @Override 
    public void onDestroyView() { 
     hideKeyboard(getView()); 
     super.onDestroyView(); 
    } 

    public void hideKeyboard(View view) { 
     if(view != null) { 
      InputMethodManager imm = (InputMethodManager) getContext() 
        .getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
     } 
    } 
} 

而且你想什麼時候會被隱藏鍵盤的所有片段關閉,必須擴展BaseFragment:

public class EditTextFragment extends BaseFragment { 
... 
} 

作爲每個擴展片段的獎勵,您可以使用hideKeyboard(View view)方法隱藏鍵盤當你想在你的片段中的任何地方

0

我已經解決了以下問題。首先,如果您想在啓動活動時自動彈出鍵盤,請在onCreate方法中編寫以下代碼。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 

然後,如果要關閉鍵盤,請使用以下內容。

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);