我在Android中有一个表单,用户必须在其中输入他们的身高。但是,我有一个微调器,用户可以在其中选择测量单位(英尺/英寸和厘米),然后是一个可以输入实际值的EditText
如果用户选择 cm 作为他们的单位,我想要一个EditText
.如果他们选择英尺/英寸,我想显示 2 个EditText
字段
我目前处理这个问题的方式似乎效率低下。我有 3 个EditText
字段:1 表示厘米、1 表示英尺和 1 表示英寸
然后,我将onItemSelected
侦听器附加到微调器。如果用户选择 cm 选项,我会在 cm EditText
上setVisibility(view.VISIBLE)
,在英尺和英寸EditText
字段上setVisibility(view.INVISIBLE)
。如果他们选择英尺/英寸选项,我只需反向显示可见性并显示/隐藏相应的字段。
是否有更合适的方法来处理需要不同数量的EditText
字段的多个单位类型?
注意:我的EditText
实际上被包裹在TextInputLayouts
中,所以我可以在提示上获得材质动画,并在我设置可见性的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个编辑文本而不是3个。对于脚和厘米都有一个主要EditText
,如果他们选择英尺和英寸,则有一个用于英寸的次要。然后,您只需设置主要EditText
的提示并切换辅助EditText
可见性。
如果您想使用 3 个EditText
优化当前解决方案,您可以做一些事情。您不必在每次他们切换单位时都设置提示,您应该能够在onCreateView
中设置一次,因为每个单位都有自己的EditText
。这将从您的方法中删除 6 行。你可以更进一步,制定一种方法toggleVisibility(EditText editText, boolean visible, boolean giveFocus)
但这取决于你。
作为旁注,您可能希望使用 View.GONE
而不是 View.INVISIBLE
。 View.INVISIBLE
只是使其不可见,但它仍然占用布局中的空间。因此,如果这是您的布局:
(输入 1) (输入 2)
您将 (input1) 设置为不可见,这就是布局的样子:
(空白) (输入 2)
相反,如果您将 (input1) 设置为 View.GONE
这就是它的样子
(输入 2)