今天在做項目的時候,要想實現一個將EditText變成不可編輯的狀態,通過查找博客,發現一個好方法,對於單獨的EditText控件我們可以單獨設置
1.首先想到在xml中設置Android:editable="false",但是如果想在代碼中動態設置可編輯狀態,沒有找到對應的函數。
2。然后嘗試使用editText.setFocusable(false);和editText.setEnabled(false);設置不可編輯狀態;editText.setFocusable(true);和 editText.setEnabled(true);設置可編輯狀態。
發現在editText.setFocusable(false);和editText.setEnabled(false);時不可編輯,但是editText.setFocusable(true);和 editText.setEnabled(true);也是不可編輯的,感覺這個時候EditText控件高亮度了,但是沒有焦點
3.最后嘗試使用editText.setFocusable(false);和editText.setFocusableInTouchMode(false);設置不可編輯狀態;editText.setFocusableInTouchMode(true);editText.setFocusable(true);editText.requestFocus();設置可編輯狀態
實現方式:
android:focusable="true" android:focusableInTouchMode="true"
4.如果讓EditText不可編輯在xml實現很簡單Android:editable 可是在代碼中卻沒有setEditable,只能使用
editText.setFilters(new InputFilter[] { new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start,
int end, Spanned dest, int dstart, int dend) {
return source.length() < 1 ? dest.subSequence(dstart, dend) : "";
}
} });
package com.battlefart; import android.app.Activity; import android.text.InputFilter; import android.text.Spanned; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Myfarts_details extends Activity{ private Button Edit_button; private EditText fart_name; private EditText last_meal; private EditText comments; private String fart_name_string; private String last_meal_string; private String comments_string; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_farts); //lock(); Edit_button=(Button)findViewById(R.id.button_edit); fart_name=(EditText)findViewById(R.id.fart_name); last_meal=(EditText)findViewById(R.id.last_meal); comments=(EditText)findViewById(R.id.comments); lock(); Edit_button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Unlock(); fart_name_string = fart_name.getText().toString(); last_meal_string = last_meal.getText().toString(); comments_string=comments.getText().toString(); SharedPreferences preference = getSharedPreferences("player_information",Context.MODE_PRIVATE); Editor edit = preference.edit(); edit.putString("my_fart_name",fart_name_string); edit.putString("my_last_meal",last_meal_string); edit.putString("my_comments",comments_string); edit.commit(); } }); } //讓EditText變成可編輯狀態 private void Unlock() { fart_name.setFilters(new InputFilter[] { new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { return null; } } }); last_meal.setFilters(new InputFilter[] { new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { return null; } } }); comments.setFilters(new InputFilter[] { new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { return null; } } }); } //讓EditText變成不可編輯狀態 private void lock(){ fart_name.setFilters(new InputFilter[] { new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { return source.length() < 1 ? dest.subSequence(dstart, dend) : ""; } } }); last_meal.setFilters(new InputFilter[] { new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { return source.length() < 1 ? dest.subSequence(dstart, dend) : ""; } } }); comments.setFilters(new InputFilter[] { new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { return source.length() < 1 ? dest.subSequence(dstart, dend) : ""; } } }); } }
(申明下,這個我是在壇子中看到的,本人測試有效) 這樣做就可以在java代碼中動態設置EditText的編輯狀態了,但這個無法解決用戶體驗的問題,軟鍵盤依然會打開,但無法輸入,但可以選擇內容。
通過這樣方式試試吧,自定義一個類繼承EditText,
如:
package custom.widget; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.EditText; public class CustomEditText extends EditText { public CustomEditText(Context context,AttributeSet attrs) { super(context,attrs); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return true; } } //然后在頁面布局文件使用自定義的EditText <custom.widget.CustomEditText android:layout_width="fill_parent" android:layout_height="wrap_content" />