2016-04-30 24 views
0

私は2つのスピナーで活動しています。 1つは髪のタイプであり、もう1つは髪の色です。スピナーから選択した2つのアイテムに基づいて、(頭の上の)画像を変更したい。ここでAndroid:2つのスピナー選択の組み合わせに基づくアクション

は、それが何をすべきかです:ロード

  1. 活動(スピナーは "ハゲ" と "黒" に設定)
    • 髪がはげています。短い黒の男性の髪に「男の短編」
      • 髪の変化へ
    • 変更髪のタイプ。短い金髪の男性の髪に 'ブロンド'
      • 髪の変化へ
    • 色を変更。

ステップ3は機能しません。

HERESに私のコード:

public class HeadZoom extends MainActivity implements AdapterView.OnItemSelectedListener{ 

private Spinner hairSpinner; 
private Spinner hairColor; 
private String type; 
private String color; 
private ImageView imageView; 
private List<String> hairTypeArray = new ArrayList<String>(); 
private List<String> hairColorArray = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.head_zoom); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    imageView = (ImageView) findViewById(R.id.head); 
    type="Bald"; 

    hairSpinner = (Spinner) findViewById(R.id.hairSpinner); 
    hairSpinner.setOnItemSelectedListener(this); 
    List<String> hairTypeArray = new ArrayList<String>(); 
    hairTypeArray.add("Bald"); 
    hairTypeArray.add("Female Short"); 
    hairTypeArray.add("Female Medium"); 
     (...) 
    ArrayAdapter<String> hairTypeAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, hairTypeArray); 
    hairTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    hairSpinner.setAdapter(hairTypeAdapter); 

    color = "Black"; 

    hairColor = (Spinner) findViewById(R.id.hairColor); 
    hairColor.setOnItemSelectedListener(this); 
    List<String> hairColorArray = new ArrayList<>(); 
    hairColorArray.add("Black"); 
    hairColorArray.add("Blonde"); 
    hairColorArray.add("Blue"); 
     (...) 
    ArrayAdapter<String> hairColorAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, hairColorArray); 
    hairColorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    hairColor.setAdapter(hairColorAdapter); 
} 

public void onItemSelected(AdapterView<?> parent, View view, int position, long id){ 
    if(parent.getId()==hairSpinner.getId()) 
     type = hairTypeArray.get(position); 
    else 
     color = hairColorArray.get(position); 

    switch(type){ 
     case "Bald": 
      imageView.setImageResource((R.drawable.sw_head)); 
      break; 
     case "Female Short": 
      if(color=="Black") 
       imageView.setImageResource(R.drawable.fhair_short_black); 
      else if(color=="Blonde") 
       imageView.setImageResource(R.drawable.fhair_short_blonde); 
      else if(color=="Blue") 
       imageView.setImageResource(R.drawable.fhair_short_blue); 
      else if(color=="Brown") 
       (...) 
       break; 
     case "Female Medium": 
      if(color=="Black") 
       imageView.setImageResource(R.drawable.fhair_med_black); 
      else if(color=="Blonde") 
       imageView.setImageResource(R.drawable.fhair_med_blonde); 
      else if(color=="Blue") 
       imageView.setImageResource(R.drawable.fhair_med_blue); 
      else if(color=="Brown") 
       (...) 
       break; 
     case "Female Long": 
       (...) 
     default: 
      break; 
    } 
} 

public void onNothingSelected(AdapterView<?> parent){ 

} 

私は同時に両方のスピナーに選択されているかを知ることができるようにする必要があります。

とき活動(ところで、それは、すぐに活動を開くとクラッシュする)

04-27 15:39:17.165 9934-9934/cameron.myapplication E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: cameron.myapplication, PID: 9934 
                   java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
                    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
                    at java.util.ArrayList.get(ArrayList.java:308) 
                    at cameron.myapplication.HeadZoom.onItemSelected(HeadZoom.java:83) 
                    at android.widget.AdapterView.fireOnSelected(AdapterView.java:931) 
                    at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:920) 
                    at android.widget.AdapterView.-wrap1(AdapterView.java) 
                    at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:890) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:148) 
                    at android.app.ActivityThread.main(ActivityThread.java:5417) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

は、両方の配列のサイズが同じで削除の値を追加values.butだけグローバル変数を取りますか? – sasikumar

+0

@sasikumarはい、両方とも7つの値を持っています。 –

+0

私の答えを確認してください – nitinkumarp

答えて

2

は理由がすでにグローバルでのArrayListを初期化されていることを示唆したように取り除きます。

private List<String> hairTypeArray = new ArrayList<String>(); 
private List<String> hairColorArray = new ArrayList<String>(); 

ので、OnCreateの方法のうちの、あなただけのローカルのArrayListはOnCreateのmethod.soのOnCreateメソッドに次のコードを

List<String> hairColorArray = new ArrayList<>(); 
List<String> hairTypeArray = new ArrayList<String>(); 
+0

ありがとうございます!私はこれを見つけられなかったと信じられない。私は間違っていたものを解決することができなかったので、私はこのプロジェクトを一ヶ月ほどやっていません。私はあなたに大きな時間を借りています! –

2

そのあなたは==演算子を持つ2つのStringオブジェクトを比較しているので、私は、このエラーレポートを取得します。 2つのStringオブジェクト間で==演算子を使用すると、両方の文字列が保持している値にかかわらず同じ参照を持つかどうかをチェックします。

あなたは、このように比較する必要があります:これはStringオブジェクトの値の代わりに、その参照をチェックします

if(color.equalsIgnoreCase("Black")) 

OR

if(color.equals("Black")) 

@sasikumarもローカル変数

List<String> hairColorArray = new ArrayList<>(); 
List<String> hairTypeArray = new ArrayList<String>(); 
関連する問題