2017-04-10 80 views
1

我有一個Spinner和EditText的活動。如果我關注EditText,則會顯示鍵盤。好。如果我再觸摸Spinner,鍵盤應該隱藏起來。我得到了這個(見代碼)。Android:隱藏鍵盤並在微調框關閉後再次顯示

現在我的問題: 當我關閉微調器(不管是否選擇一個項目),如果鍵盤再次打開EditText而不點擊它將會很好。 (打開微調時的重點仍然是在的EditText)

EditText myET = (EditText) findViewById(R.id.editText); 
Spinner mySpin = (Spinner) findViewById(R.id.spinner); 
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); 

Spinner.OnTouchListener hideKeyboard = new Spinner.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 
     return false; 
    } 
}; 
mySpin.setOnTouchListener(hideKeyboard); 

回答

1

使用此代碼在onItemSelected

InputMethodManager imm = (InputMethodManager) 
getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT); 

這會自動打開鍵盤下一個EDITTEXT。

+0

這隻能如果讓我選擇一個項目(不一樣的已選擇的項目) – yvi

+0

可能在微調上述EDITTEXT你可以檢查,當用戶點擊進入轉到下一個EDITTEXT(在這種情況下必須關閉鍵盤),你應該檢查是否選擇了微調項目,如果選擇了它,那麼你應該使用上面的代碼打開下一個editText的鍵盤 – Anmol

1

使用此代碼來選擇項目上再次顯示鍵盤:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
       // open keyboard code here. 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> adapterView) { 

      } 
     }); 

注:使用點擊監聽器來滿足您的要求。作爲微調不直接點擊監聽器不支持,所以讓一個類擴展微調,並在點擊方法,在這種方法做你想做的事情。

/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */ 
    public class CutomSpinner extends Spinner { 

     public CutomSpinner(Context context) 
     { super(context); } 

     public CutomSpinner (Context context, AttributeSet attrs) 
     { super(context, attrs); } 

     public CutomSpinner (Context context, AttributeSet attrs, int defStyle) 
     { super(context, attrs, defStyle); } 

     @Override public void 
     setSelection(int position, boolean animate) 
     { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position, animate); 
     if (sameSelected) { 
      // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 
      getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId()); 
     } 
     } 

     @Override public void 
     setSelection(int position) 
     { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position); 
     if (sameSelected) { 
      // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 
      getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId()); 
     } 
     } 
    } 
+0

只有當我選擇一個新的項目,而不是如果我使用與之前相同的選擇關閉微調器或者沒有選擇 – yvi

+0

您是否嘗試將相同的代碼添加到onNothingSelected()? –

+0

是的,我做到了。似乎這部分永遠不會到達 – yvi

1

我發現了一個解決方案,可以做到那麼下面

當u按EditText上鍵盤上顯示當U按下微調消失

然後當U上微調選擇項目即使同一項目鍵盤再次出現

最終的概率,你有,如果我按微調(所以鍵盤消失),然後我按下屏幕上的任何地方(我想鍵盤重新出現),這很容易,只是使全局布爾設置爲true,每次你使鍵盤a ppears反之亦然,使onClickListener對於除微調ofcourse在活動的所有意見和onClickListener有以下代碼

boolean keyboardIsVisible; // which is true if keyboard is visible 
if (!keyboardIsVisible) { 
     InputMethodManager imm = (InputMethodManager) 
       getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); 
} 

這裏是代碼,解決了所有的,除了最後的概率,因爲我已經告訴ü如何解決這個問題

CustomSpinner.java

public class CustomSpinner extends Spinner { 

    Context mainContext; 

    public CustomSpinner(Context context) { 
     super(context); 
     mainContext = context; 
    } 

    public CustomSpinner (Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mainContext = context; 
    } 

    public CustomSpinner (Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     mainContext = context; 
    } 

    @Override public void 
    setSelection(int position) { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position); 
     if (sameSelected) { 
      Activity activity = (Activity) mainContext; 

      EditText editText = (EditText) activity.findViewById(R.id.edit_text); 

      InputMethodManager imm = (InputMethodManager) 
        activity.getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); 
     } 
    } 
} 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    EditText editText; 
    Button button; 
    CustomSpinner customSpinner; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     editText = (EditText) findViewById(R.id.edit_text); 
     button = (Button) findViewById(R.id.button); 
     customSpinner = (CustomSpinner) findViewById(R.id.spinner); 

     customSpinner.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       editText.setEnabled(false); 
       editText.setEnabled(true); 
       return false; 
      } 
     }); 

     customSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      int count = 0; 

      @Override 
      public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
       if (count > 0){ 
        InputMethodManager imm = (InputMethodManager) 
          getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); 
       }else count++; 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> adapterView) { 
       // Do Nothing 
      } 
     }); 
    } 

}