0

Androidの高さを入力するフォームがあります。しかし、ユーザーが測定単位(フィート/インチ、センチメートル)を選択できるスピナーがあり、次にEditText実際の値を入力できる場所複数のユニットタイプのAndroid EditText

ユーザーがcmを単位として選択すると、シングルEditText。彼らがフィート/インチを選択した場合、私は2 EditTextのフィールドを表示したい

私は現在これを処理している方法は非効率的だと思われます。私は3 EditTextフィールドを持っています:1 cm、足は1、インチは1

私はonItemSelectedリスナーをスピナーに付けます。ユーザーがcmオプションを選択した場合、EditTextのI setVisibility(view.VISIBLE)、フィートとインチの両方のsetVisibility(view.INVISIBLE)EditTextフィールド。彼らが足/インチオプションを選択した場合、私は逆の可視性を行い、対応するフィールドを表示/非表示にします。

異なる数の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; 
     } 
    } 

答えて

0

あなたは、彼らが足を選択した場合は代わりに3のちょうど2 EditTextsは足とCMSとインチのセカンダリ1の両方のための主要EditTextを持って使用してそれを行う可能性があり、インチ。次に、プライマリEditTextのヒントを設定し、セカンダリEditTextの表示を切り替えます。

現在のソリューションを3 EditTextで最適化する場合は、いくつかのことができます。ユニットを切り替えるたびにヒントを設定する必要はありません。onCreateViewに一度だけ設定することができます。ユニットごとにEditTextがあるため、ヒントを設定する必要があります。あなたのメソッドから6行を削除します。あなたはさらにそれを取って、方法を作ることができますtoggleVisibility(EditText editText, boolean visible, boolean giveFocus)しかしあなた次第です。

View.INVISIBLEの代わりにView.GONEを使用すると便利です。 View.INVISIBLEは表示されないだけですが、それでもレイアウト内のスペースを消費します。これはあなたのレイアウトであれば:(INPUT1)(入力2)

、あなたは目に見えないし(INPUT1)を設定、このレイアウトは次のようになります。(空白)

(入力2)

は、設定の代わりにいる場合(INPUT1)View.GONEにこれは

(入力2)ヒントの設定に関するヒントについて

+0

おかげでどのように見えるかです。ユーザーがFeetを選択したときにCM EditTextを 'View.GONE'で設定した場合、ユーザーがスピナーからCMを選択した場合、再び元に戻すにはどうすればいいですか?すなわち、 'View.GONE'の反対のものは何ですか? – Simon

+0

を 'View.VISIBLE'に戻して設定すると、そのジョブが実行されます。彼らの意見が反対であるとは思わないでください。'VISIBLE 'は、完全に可視である「INVISIBLE」は、可視ではないがまだ空間を占める状態であり、「GONE」は、可視ではなく空間をとらない状態である。これらの状態はいずれも最終的なものではなく、安全に相互に交換することができます。 – Dom

関連する問題