如何在代码中复制android:editable =“false”?

时间:2009-03-18 21:19:53

标签: android android-edittext

在布局中,您可以通过EditTextandroid:editable attribute窗口小部件设置为不可编辑。

我怎样才能在代码中执行此操作?我需要根据条件使EditText窗口小部件可编辑。

14 个答案:

答案 0 :(得分:38)

editText.setFocusable(false);
editText.setClickable(false);

这可确保无法选择和关注EditText控件,因此无法进行编辑。

答案 1 :(得分:27)

我自己就试过了,

禁用编辑文字:

.setFocusable(false);

这也将setFocusableInTouchMode设置为false!

启用编辑文字:

setFocusableInTouchMode(true);

这也将setFocusable设置为true;

答案 2 :(得分:15)

最好的方法是使用这一行代码:

textView.setKeyListener(null);

文档说这个方法:

  

设置要使用的键侦听器   这个TextView。这可以为null   禁止用户输入。

答案 3 :(得分:13)

我认为拒绝所有更改的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),以克服删除字词的行为。

答案 4 :(得分:6)

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);

答案 5 :(得分:5)

你可以试试这个:

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

这将完全禁用EditText,如果您不希望用户打开编辑文本选项,请禁用长按。

答案 6 :(得分:3)

我没有在EditText中看到该属性的相关方法 类。但是,您可以使用其他类似的东西,例如 android:focus/setFocusable(boolean)或创建另一个TextView android:editable="false"并使用setVisiblilty()切换 可编辑且不可编辑的视图。如果您使用View.GONE,用户将会 永远不知道有两个EditTexts。

如果你有野心,你可能会对EditText的onTextChanged听众做一些事情,比如让它与setText做出反应。

答案 7 :(得分:3)

你试过setText(java.lang.CharSequence, android.widget.TextView.BufferType)吗? 它被描述为:

  

设置此TextView要显示的文本(请参阅setText(CharSequence)),并设置它是否存储在可设置/可跨越缓冲区以及是否可编辑

(强调我的)

答案 8 :(得分:3)

[发表新答案,因为我无法对Josef的答案发表评论。]

输入过滤器工作正常,但它有一个微妙的错误:在选择上键入将删除所有文本。

例如,假设您在"foo"中有文字EditText。如果您全部选中(例如,双击它)并输入'a',文本将消失。这是因为InputFilter将被称为:

filter("a", 0, 1, "foo", 0, 3);

在这种情况下,建议的输入过滤器将返回空字符串(因为src.length() < 1false),这解释了缺少的文本。

解决方案是简单地在过滤器函数中返回dst.subSequence(dstart, dend)。即使删除也可以正常工作。

答案 9 :(得分:2)

我想

Edittext.setEnabled(false); 

通过代码

android:enabled="false"

通过xml.Also查看SO上的这篇文章。

他们应该工作,您可以以编程方式再次启用Edittext.setEnabled(true);

答案 10 :(得分:1)

我还想指出一个替代解决方案,如果您正在创建EditView的新实例,它可以很好地工作。您可以按文档建议覆盖方法getDefaultEditable()以返回false。 E.g。

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};

答案 11 :(得分:0)

我在这个场景中找到的唯一解决方案是创建2个布局。一个是可编辑的,一个不是。您可能必须根据各种条件创建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();
}

希望这会有所帮助。确实有一个更好的解决方案,但这就是我一直在做的事情。理想情况下,人们可以在单个字段上执行此操作,而无需重新加载活动/布局。 -bobby

答案 12 :(得分:-1)

我认为达到预期效果的正确方法是:

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);

答案 13 :(得分:-1)

试试这个:

var current = {
        coordinates: "2208,1922",
        name: "current"
      }

var Photo =  {
      current: current,
      start: {
        coordinates: '2408,1822',
        name: 'start',
        newCoordinates: current.coordinates
        }
  };
  
  console.log(Photo);