2016-11-11 30 views
2

我有一個片段中的線性佈局,裏面有一堆複選框和各種edittext小部件。基本上就像一個測驗。一堆多選(複選框)和十幾個簡短的回答(edittexts)問題。使EditText在完成編輯時將焦點傳遞迴父佈局。

我想讓用戶能夠點擊一個edittext,輸入一個答案,然後按DONE或者點擊佈局的任何其他地方,讓小部件失去焦點和鍵盤隱藏。目前,我正在覆蓋每個edittext的setOnEditorActionListenersetOnFocusChangeListener方法,以將焦點重新分配給主佈局,並分別隱藏鍵盤。這是所謂的「input_7d」爲一個EditText實例代碼:

final EditText input_7d = (EditText) thisview.findViewById(R.id.txtinput_7d); 
    final LinearLayout parentLayout = (LinearLayout) thisview.findViewById(R.id.main_layout); 

    input_7d.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if(actionId == EditorInfo.IME_ACTION_DONE) { 
       parentLayout.requestFocus(); 
      } 
      return false; 
     } 
    }); 

    input_7d.setOnFocusChangeListener(new TextView.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(!hasFocus){ 
       InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(parentLayout.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS); 
      } 
     } 
    }); 

這是惱人的每一個我的EditText加做的,這意味着編輯大量的代碼,如果刪除它們,或在未來增加更多。我想要做的是有一個自定義的edittext類,它可以將焦點返回給它的父視圖/佈局並隱藏鍵盤,然後使用它來代替內置的edittext。我對此很新,而且我一直無法找到自定義edittext將焦點傳回給它的父級佈局的方法。有沒有更好的方式來獲得一堆edittexts都有這種行爲,而不是所有「硬編碼」到我的片段類?

+0

我知道可以在Android中定義自定義視圖,您也可以在其中定義自定義視圖的標準行爲。我會建議嘗試一下。 –

+1

@Stitchblade是的,我最終這樣做了,正如我在下面的答案中所展示的那樣。不幸的是,我無法弄清楚如何將焦點傳遞給自定義視圖內的另一個視圖/佈局。但至少我的自定義視圖爲我添加的每個editText保存了40行代碼。 – Samuel

回答

0

,所以我不能找到一種方法,有一個EditText上通焦點回到它的父佈局從視圖內部。所以不是我選擇只是禁用它可成爲焦點屬性時,它

1)它失去焦點(用戶點擊的視野之外的東西可成爲焦點,即父佈局)

2)完成它的編輯(用戶按軟鍵盤上的完成操作)

令人驚訝的是,默認情況下這些操作都不會從默認的editText中移除焦點和光標。至少不在我的滾動視圖。

所以我添加這些行到自定義視圖,它擴展了EDITTEXT視圖(myEditText):

this.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if(actionId == EditorInfo.IME_ACTION_DONE) { 
      myEditText.setFocusable(false); 
      myEditText.setFocusableInTouchMode(false); 

     } 
     return false; 
    } 
}); 
this.setOnFocusChangeListener(new TextView.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if(!hasFocus){ 
      myEditText.setFocusable(false); 
      myEditText.setFocusableInTouchMode(false); 
      hideKeyboardFrom(context, v); 
     } 
    } 
}); 
this.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     myEditText.setFocusableInTouchMode(true); 
     myEditText.setFocusable(true); 
     return false; 
    } 
}); 

我覺得很煩人,讓簡單的功能,例如不具有光標在我眨眼總是或有視圖在更換碎片時不會集中注意力,因此您必須執行這種奇怪的解決方法。讓視圖變得無法聚焦,除非焦點集中在這種情況下它是可以集中的,但直到焦點再次集中爲止才顯得愚蠢。仍然想知道是否有更好的方法來做到這一點在一個佈局的大量編輯。

+0

請將此標記爲答案 –

0

你可以設置一個觸摸監聽根佈局,然後清除病竈時不需要視圖

 findViewById(R.id.rootView).setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
     v.requestFocusFromTouch() //check for y 
      return false; 
     } 
    }); 
+0

不幸的是,這會使軟鍵盤可見,並且不能解決用戶按下DONE鍵後焦點返回佈局的問題。所以我仍然需要檢測DONE,以及在每次觸摸rootView時嘗試關閉鍵盤。我已經將根視圖設置爲可在xml中單擊,這基本上就是您的代碼正在執行的操作。 – Samuel