如何在 activity 加载期间禁用 EditText 控件并通过用户操作启用它

How to disable EditText control during activity load and enable it by user action

我有一个 activity 加载有多个 EditText 控件和一个按钮。 EditText 控件显示来自 SQLlite 数据库的值。我希望 EditTtext 控件在 activity 加载时为只读(甚至不可单击),然后在用户单击按钮时变为 editable/clickable。

我在这里阅读了很多其他话题,看来您可以通过几种不同的方式来做到这一点。

  1. 在 XML 中禁用控件并在代码中启用(用户操作)
  2. 在代码中禁用控件 (onCreate) 并在代码中启用(用户操作)

现在我无法通过任何一种方式工作。似乎如果我禁用它,我将永远无法为用户输入再次启用它。如果我启用它,它始终处于启用状态,我永远无法禁用它。

这是我当前的代码:

XML - 这是我要禁用的控件,直到用户执行某些操作(单击按钮)

        <EditText
            android:layout_width="0dp"
            android:layout_weight="1.5"
            android:layout_height="wrap_content"
            android:cursorVisible="true"
            android:editable="false"
            android:inputType="numberDecimal"
            android:id="@+id/itemPrice"/>
    </TableRow>
    <!-- End Item Price -->

JAVA - 这是刚刚清除 form/UI 并尝试为用户输入启用 2 个 EditText 字段的代码

//Add item to the inventory.  Enables the EditText control for user intput (name and price)
public void addNewItem(View view)
{
    try
    {
        //Clear the fields on the form/UI
        itemId.setText("");
        itemName.setText("");
        itemPrice.setText("");
        itemDelete.setText("");

        //Enable the controls
        itemName.setEnabled(true);
        itemPrice.setEnabled(true);
        itemName.setFocusable(true);
        itemPrice.setFocusable(true);
        itemName.setClickable(true);
        itemPrice.setClickable(true);
    }
    catch(Exception erMsg)
    {
        erMsg.printStackTrace();
    }
}

我仍然在每个控件上设置了 setEnabled(true),即使它从未被禁用,但最新的代码只是在尝试启用它。

我不想让这个问题变得主观,但如果有优先级(XML或Java),有没有更好的方法?比如XML设置字段为:focusable:false,Java设置字段setFocusable(true),是否有优先级?

你可以动态设置android:editable,加载完成后,如android:editable ="true"

我会把答案放在这里,因为这个问题似乎被问了很多,而答案从来没有真正被理解或清楚。

这是我没有使用XML

的方法

在 onCreate() 方法中,我通过以下代码禁用了用户输入:

//Disable the itemName control
        itemName.setInputType(InputType.TYPE_NULL);
        itemName.setFocusable(false);

        //Disable the itemPrice control
        itemPrice.setInputType(InputType.TYPE_NULL);
        itemPrice.setFocusable(false);

我在用户单击按钮后启用了控件,但这并没有在按钮的 actionListener 中完成,只是在单击按钮时调用的方法。

//Enable the controls
            itemName.setInputType(InputType.TYPE_CLASS_TEXT);
            itemName.setFocusableInTouchMode(true);
            itemName.setFocusable(true);

        itemPrice.setInputType(InputType.TYPE_CLASS_TEXT);
        itemPrice.setFocusableInTouchMode(true);
        itemPrice.setFocusable(true);

这完全有效,当未启用 EditText 进行编辑时,它仍然可见(在 setDisabled(true)

时不会变灰)