【问题标题】:Android EditText for multiple unit types适用于多种单元类型的 Android EditText
【发布时间】:2016-03-19 00:25:17
【问题描述】:

我在 Android 中有一个表单,用户必须在其中输入他们的身高。但是,我有一个微调器,用户可以在其中选择测量单位(英尺/英寸和厘米),然后是 EditText,他们可以在其中输入实际值

如果用户选择厘米作为他们的单位,我想要一个EditText。如果他们选择英尺/英寸,我想显示 2 个EditText 字段

我目前处理此问题的方式似乎效率低下。我有 3 个EditText 字段:1 个用于厘米,1 个用于英尺,1 个用于英寸

然后我将onItemSelected 侦听器附加到微调器。如果用户选择 cm 选项,我在 cm EditTextsetVisibility(view.VISIBLE),在英尺和英寸 EditText 字段上 setVisibility(view.INVISIBLE)。如果他们选择英尺/英寸选项,我只需反向显示可见性并显示/隐藏相应的字段。

是否有更合适的方法来处理需要不同数量的EditText 字段的多种单元类型?

注意:我的 EditText 实际上包含在 TextInputLayouts 中,因此我可以在提示中获取 Material 动画,并在 TextInputLayouts 上设置可见性。

代码如下所示:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        //Height unit spinner
        String [] values = {"cm","ft"};
        Spinner spinner = (Spinner) view.findViewById(R.id.input_height_spinner);
        spinner.setOnItemSelectedListener(this);
        ArrayAdapter<String> LTRadapter = new ArrayAdapter<>(this.getActivity(), android.R.layout.simple_spinner_item, values);
        LTRadapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
        spinner.setAdapter(LTRadapter);

        heightCMWrapper = (TextInputLayout) view.findViewById(R.id.input_height_cm_wrapper);
        heightFTWrapper = (TextInputLayout) view.findViewById(R.id.input_height_ft_wrapper);
        heightINWrapper = (TextInputLayout) view.findViewById(R.id.input_height_in_wrapper);

//Some other code for inflating layout etc.
}

@Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        switch (position) {
            case 0:
                heightCMWrapper.setVisibility(view.VISIBLE);
                heightCMWrapper.setHint("Height (cm)");
                heightCMWrapper.requestFocus();

                heightFTWrapper.setVisibility(view.INVISIBLE);
                heightFTWrapper.setHint("");
                heightINWrapper.setVisibility(view.INVISIBLE);
                heightINWrapper.setHint("");
                break;
            case 1:
                heightCMWrapper.setVisibility(view.INVISIBLE);
                heightCMWrapper.setHint("");

                heightFTWrapper.setVisibility(view.VISIBLE);
                heightFTWrapper.setHint("Feet");
                heightFTWrapper.requestFocus();
                heightINWrapper.setVisibility(view.VISIBLE);
                heightINWrapper.setHint("Inches");
                break;
        }
    }

【问题讨论】:

    标签: android android-layout android-edittext android-spinner android-textinputlayout


    【解决方案1】:

    您可以只使用 2 个 EditText 而不是 3 个。如果他们选择英尺和英寸,则为英尺和厘米设置一个主要的 EditText,并为英寸设置一个次要的 EditText。然后你只需要设置主要EditText 的提示并切换次要EditText 可见性。

    如果您想使用 3 EditText 优化您当前的解决方案,您可以做一些事情。您不必在每次切换单位时都设置提示,您应该可以在onCreateView 中设置一次,因为每个单位都有自己的EditText。这将从您的方法中删除 6 行。您可以更进一步并创建一个方法 toggleVisibility(EditText editText, boolean visible, boolean giveFocus) 但这取决于您。

    作为旁注,您可能希望使用View.GONE 而不是View.INVISIBLEView.INVISIBLE 只是让它不可见,但它仍然占用布局中的空间。所以如果这是你的布局:

    (输入1)(输入2)

    并且您将 (input1) 设置为不可见,这就是布局的样子:

    (空白)(输入2)

    如果您将 (input1) 设置为 View.GONE,这就是它的样子

    (输入 2)

    【讨论】:

    • 感谢提示设置的提示。如果我在用户选择脚时将 CM EditText 设置为 View.GONE,如果用户从微调器中选择 CM,我该如何再次将其恢复?即View.GONE的反义词是什么?
    • 将其设置回View.VISIBLE 就可以了。不要将它们视为对立面,而应将它们更多地视为状态。 VISIBLE 是完全可见的状态,INVISIBLE 是不可见但仍占用空间的状态,GONE 是不可见且不占用任何空间的状态。这些状态都不是最终状态,您可以在它们之间安全地互换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多