2014-12-04 175 views
0

美好的一天。對不起,長名稱,我必須是描述性的。Android - 從類中調用DialogFragment方法關閉DialogFragment的軟鍵盤

我有一個Android應用程序,我有一個自定義ListView與EditText和一個DialogFragment的頂部。用戶仍然可以看到EditText,因爲DialogFragment沒有覆蓋整個屏幕,用戶仍然可以在ListView中選擇EditText。我的自定義ListView中的EditText有一個custom Keyboard from this tutorial。我的對話框片段包含一個使用默認Android軟鍵盤的編輯文本。

我遇到的主要問題是當用戶單擊我的對話框片段(android軟鍵盤顯示)中的EditText並單擊自定義ListView中的EditText時,我的自定義鍵盤顯示在Android軟件後面鍵盤和Android軟鍵盤不會摺疊/隱藏。

一個解決我確實是這樣的:

我提出的對話片段的根視圖(的EditText的父視圖)是可選擇的爲這樣:

android:clickable="true" 
android:focusableInTouchMode="true" 

使得聚焦ISN 't「鎖定」或被EditText壟斷。我還在隱藏軟鍵盤的DialogFragment類中創建了一個函數。我有兩個人,他們都工作:

public void hideKB(){ 

    InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(instructionInput.getWindowToken(), 0); 
    //instructionInput is my EditText 

} 

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

我呼籲爲二者之一,例如:

instructionInput.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (!hasFocus) { 
      hideKB(); 
      //hideKeyboard(v); 
     } 
    } 
}); 

,它工作正常。當用戶點擊對話框片段時,軟鍵盤關閉。

現在,我想調用此函數或實現相同的效果,當用戶單擊我的自定義ListView中的EditText。在我的EditText自定義鍵盤類具有這樣的功能:

public void registerEditText(int resid, final SearchResult context, final ItemDialog itemDialog) { 
    EditText edittext= (EditText)mHostActivity.findViewById(resid); 
    edittext.setOnFocusChangeListener(new OnFocusChangeListener() { 

     @Override public void onFocusChange(View v, boolean hasFocus) { 
      if(hasFocus) { 
       Log.d("hello","edittext focused"); 

       itemDialog.hideKB(); 
       showCustomKeyboard(v); 

      } 
      else { 
       hideCustomKeyboard(); 
      } 
     } 
    }); 

    //removed extra lines of code 

} 

請不是SearchResult是DialogFragment的基本活動和ItemDialog是我的對話片段。

我所做的是,當用戶專注於ListView中的EditText時,onFocusChange函數會觸發,並嘗試調用我的Dialog Fragment的hideKB()函數。不過,我拋出一個NullPointerException:

FATAL EXCEPTION: main 
Process: com.agict.marswin, PID: 14038 
java.lang.NullPointerException 
    at UtilityClasses.CustomKeyboard$2.onFocusChange(CustomKeyboard.java:187) 

和187線在我CustomKeyboard是調用從對話片段的功能代碼:

itemDialog.hideKB(); 

而且我不明白爲什麼我收到因爲我在初始化我的itemDialog之後調用了registerEditText,因此該行爲空指針。我認爲我的問題歸結爲從一個類調用DialogFragment的函數。

任何人都可以幫助我嗎?過去6個多小時我一直在爲此工作,並且我被卡住了。很感謝任何形式的幫助。謝謝。

回答

0

好的,抱歉,我找到了。問題是itemDialog爲空。我所做的,而不是是這樣的:

在我SearchResult活動中,我創建了一個公共ItemDialog這樣:

public ItemDialog itemDialog; 

然後,我實例化它通常,創建和顯示它。所以現在我有一個正確實例化的DialogFragment,它可以被任何類訪問,因爲它是公開的。

要去registerEditText()功能,這裏就是我所做的:

public void registerEditText(int resid, final SearchResult searchResult, final ItemDialog itemDialog) { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if(hasFocus) { 
      Log.d("hello","edittext focused"); 

      searchResult.itemDialog.hideKB(); 
      showCustomKeyboard(v); 

     } 
     else { 
      hideCustomKeyboard(); 
     } 
    } 
    //extra code here 
} 

因爲我傳遞活動的registerEditText功能,例如在我的信息搜索結果的活動:

mCustomKeyboard.registerEditText(R.id.qtyInputSearchResult, SearchResult.this, itemDialog); 
mCustomKeyboard.registerEditText(R.id.discInputSearchResult, SearchResult.this, itemDialog); 

(實際上是最後一個參數不再需要)

我可以使用第二個參數SearchResult來訪問itemDialog VA riable(不是null並且完全實例化),並且從那裏,我可以正確地調用我的函數。

我知道這不是最好的方式去做,但到目前爲止,它的工作原理。