Android 多种单位类型的 EditText

Android EditText for multiple unit types

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

如果用户selects厘米为单位,我要单EditText。如果他们 select feet/inches,我想显示 2 EditText 个字段

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

然后我将 onItemSelected 侦听器附加到微调器。如果用户 select 选择厘米选项,我 setVisibility(view.VISIBLE) 在厘米 EditText 上,setVisibility(view.INVISIBLE) 在英尺和英寸 EditText 字段上。如果他们 select feet/inches 选项,我只是做相反的可见性和 show/hide 相应的字段。

是否有更合适的方法来处理需要不同数量 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;
        }
    }

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

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

作为旁注,您可能希望使用 View.GONE 而不是 View.INVISIBLEView.INVISIBLE 只是让它不可见,但它仍然在布局中消耗它的 space。因此,如果这是您的布局:

(输入1) (输入2)

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

(空白)(输入 2)

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

(输入 2)