Androidを複製する方法:editable =“ false” in code?
-
20-08-2019 - |
質問
レイアウトでは、を設定できます EditText
介して編集できないウィジェット android:editable attribute
.
コードでこれを行うにはどうすればよいですか?私は作る必要があります EditText
条件に応じて編集可能になるウィジェット。
解決
私は思います InputFilter
それはすべての変更を拒否することは良い解決策です:
editText.setFilters(new InputFilter[] {
new InputFilter() {
public CharSequence filter(CharSequence src, int start,
int end, Spanned dst, int dstart, int dend) {
return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
}
}
});
編集: Dlazarは(以下)を変更することを提案しました return
に dst.subSequence(dstart, dend)
単語を削除する行動を克服するため。
他のヒント
editText.setFocusable(false);
editText.setClickable(false);
これにより、 EditText
コントロールを選択して焦点を合わせることができないため、編集することはできません。
私はこれを自分で試しました、
編集テキストを無効にするには:
.setFocusable(false);
これにより、setFocusableIntouchModeをfalseに設定します!
テキストの編集を有効にするには:
setFocusableInTouchMode(true);
これにより、SetFocusableがTrueに設定されます。
これを行うための最良の方法は、この単一のコードを使用することです。
textView.setKeyListener(null);
ドキュメントはこの方法について次のように述べています。
このTextViewで使用するキーリスナーを設定します。これは、ユーザー入力を許可するためにnullにすることができます。
android:editable="false"
android:inputType="none"
XMLまたは
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);
また
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);
あなたはこれを試すことができます:
mEditText.setFocusable(false);
mEditText.setClickable(false);
mEditText.setFocusableInTouchMode(false);
mEditText.setLongClickable(false);
mEditText.setInputType(InputType.TYPE_NULL);
これにより、Edittextが完全に無効になり、ユーザーがテキストオプションの編集を開いてもらいたくない場合は、Long Pressを無効にします。
Edittextクラスには、その属性の関連方法が表示されません。ただし、使用できる他の同様のことがあります。android:focus/setFocusable(boolean)
または、その他のテキストビューを作成しますandroid:editable="false"
そして使用します setVisiblilty()
編集可能な編集ビューと編集可能なビューを切り替える。使用する場合 View.GONE
ユーザーは、2つの編集があることを決して知りません。
あなたの野心的な気持ちなら、おそらくedittextのことで何かをすることができます onTextChanged
リスナーはそれをaと反応させるようなものです setText
.
ジョセフの答えについてコメントできないので、新しい答えを投稿してください。
入力フィルターは正常に動作しますが、微妙なバグがあります。選択を入力すると、すべてのテキストが削除されます。
たとえば、テキストがあるとします "foo"
の中に EditText
. 。すべてを選択した場合(たとえば、ダブルクリックすることによって)、タイプ 'a'
, 、テキストが消えます。これは、 InputFilter
と呼ばれます:
filter("a", 0, 1, "foo", 0, 3);
提案された入力フィルターは、この場合の空の文字列を返します(なぜなら src.length() < 1
は false
)、欠落しているテキストを説明します。
解決策は、単に戻ることです dst.subSequence(dstart, dend)
フィルター関数。これは、削除でも正常に機能します。
やってみました settext(java.lang.chhareashence、android.widget.textview.buffertype) ?それは次のように説明されています:
このTextViewが表示するテキストを設定します(Settext(CharSequence)を参照)。 そして、それが編集可能かどうか.
(私の強調)
私は推測する
Edittext.setEnabled(false);
コードを介して
と
android:enabled="false"
xml.また、この投稿を確認してください それで.
彼らは働くべきであり、あなたはプログラムで再び有効にすることができます Edittext.setEnabled(true);
また、編集の新しいインスタンスを作成している場合にうまく機能する代替ソリューションを指摘したかったのです。 docsが提案してfalseを返すように、メソッドgetDefaultEditable()をオーバーライドできます。例えば
EditText view = new EditText(DiscountCalculator.this) {
public boolean getDefaultEditable() {
return false;
}
};
このシナリオで見つけた唯一のソリューションは、2つのレイアウトを作成することです。 1つは編集可能で、1つはそうではありません。さまざまな条件に基づいて2つ以上のレイアウトを作成する必要がある場合があります。条件をSharedPreferencesまたはその他の手段で保存し、アクティビティを再起動した後の条件に基づいて関連するレイアウトをロードします。これが例です:
アクティビティのoncreate()で:
configuration = new Configuration(this.getSharedPreferences(Configuration.SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE));
manualSettingsMode = configuration.isManualSettingsMode();
if(manualSettingsMode){
setContentView(R.layout.editableconfigurationsettings);
}else {
setContentView(R.layout.configurationsettings);
}
アクティビティは、条件および呼び出し関数のテストに基づいて再起動できます。
private void setManualEditing(){
configuration.set_isManualSettingsMode(true);
this.recreate();
}
private void setAutoEditing(){
configuration.set_isManualSettingsMode(false);
this.recreate();
}
お役に立てれば。本当により良い解決策がなければなりませんが、これが私がやっていることです。理想的には、個々のフィールドでこれを行うことができ、アクティビティ /レイアウトをリロードする必要はありません。 - ボビー
私は、望ましい効果を達成するための正しい方法は次のとおりです。
mEditView.setText("my text", BufferType.NORMAL);
編集可能なものと編集不可能を切り替えたい場合は、次のことを行うことができます。
// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);
// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);
これを試して:
mEditText.setFilters(new InputFilter[]{new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (XXX) {
return "";
} else {
return null;
}
}
}});