2016-11-09 13 views
0

MainActivityChangeBrushの間でブラシのサイズとブラシの形状を渡します。Android - 2つのアクティビティ間でputExtrasを使用して複数のパラメータを渡す

メイン:

static final int ACTIVITY_BRUSH_SIZE_REQUEST_CODE = 2; 
static final int ACTIVITY_BRUSH_SHAPE_REQUEST_CODE = 3; 

public void onClickBrush(View view) { 
    Intent intent = new Intent(MainActivity.this, ChangeBrush.class); 

    startActivityForResult(intent, ACTIVITY_BRUSH_SIZE_REQUEST_CODE); 
    startActivityForResult(intent, ACTIVITY_BRUSH_SHAPE_REQUEST_CODE); 
} 

ChangeBrush:

public void onClickChangeBrushSize(View view) { 
    String size = view.getTag().toString().; 

    // return the brush size to main activity 
    Bundle bundle = new Bundle(); 
    bundle.putString("size", size); 

    Intent intent = new Intent(); 
    intent.putExtras(bundle); 
    setResult(Activity.RESULT_OK, intent); 

    finish(); 
} 

public void onClickChangeBrushShape(View view) { 
    String shape = view.getTag().toString(); 

    // return the brush shape to main activity 
    Bundle bundle = new Bundle(); 
    bundle.putString("shape", shape); 

    Intent intent = new Intent(); 
    intent.putExtras(bundle); 
    setResult(Activity.RESULT_OK, intent); 

    finish(); 
} 

SelectBrushアクティビティのレイアウト:

enter image description here

sizeボタンとshapeボタンをクリックしたユーザをのアクティビティは、sizeshapeMainActivityに渡すことができます。 MainActivityでは、私はonActivityResultを使ってブラシのサイズと形状を設定します。

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 

     Bundle bundle = data.getExtras(); 
     String color = bundle.getString("color"); 
     String size = bundle.getString("size"); 
     String shape = bundle.getString("shape"); 

     switch(requestCode) { 
      case ACTIVITY_COLOR_REQUEST_CODE: 
       fingerPainterView.setColour(Color.parseColor(color)); // set new color value 

      case ACTIVITY_BRUSH_SIZE_REQUEST_CODE: 
       Log.d("FingerPainter", "Main activity change brush size to " + size); 

      case ACTIVITY_BRUSH_SHAPE_REQUEST_CODE: 
       Log.d("FingerPainter", "Main activity change brush shape to " + shape); 
     } 

    } else if(resultCode == RESULT_CANCELED) { 
     Log.d("FingerPainter", "MainActivity canceled"); 

    } 
} 

これは、戻り値をログに記録します。

D/FingerPainter: Main activity change brush shape to null 
D/FingerPainter: Main activity change brush size to null 
D/FingerPainter: Main activity change brush shape to SQUARE 

戻り値は右の意図に対応することができるようです。なぜシェイプ情報を2回記録するのか分かりません。 finish()に何か問題がありますか?私は、ユーザーがサイズと形状の両方を選択し、メインアクティビティに戻るようにします。

方法が間違っている場合、これらの2つの値を渡すにはどうすればよいですか?私が見

+0

あなたはどのボタンを 'onClickBrush'にマップしましたか?それらのすべて? [サイズ]ボタンと[形状]ボタンを2つの別個のインテントに分割する必要があります。 –

+0

@ cricket_007 'onClickBrush'は' ChangeBrush'アクティビティを開始します。 'ChangeBrush'アクティビティでは、サイズと形状を2つのインテント(メソッド)に分割します。 – Helen

+0

'onClickBrush'は' ChangeBrush'を現時点で2回起動するようです。 –

答えて

0

2つの問題:

1:あなたが二回startActivityForResultを呼んでいます。 intent.putExtra(...)を使用してエクストラを渡すことができます。

2:あなたのswitch文でbreakを持っていない:

switch(requestCode) { 
    case ACTIVITY_COLOR_REQUEST_CODE: 
     fingerPainterView.setColour(Color.parseColor(color)); // set new color value 
    break; 
    case ACTIVITY_BRUSH_SIZE_REQUEST_CODE: 
     Log.d("FingerPainter", "Main activity change brush size to " + size); 
    break; 
    case ACTIVITY_BRUSH_SHAPE_REQUEST_CODE: 
     Log.d("FingerPainter", "Main activity change brush shape to " + shape); 
    break; 
} 
+0

私はちょうど今、 '休憩 'を追加し、それは1つの形状と1つのサイズを返します。最初にシェイプを選択してサイズを選択すると機能します。これは正しい値をmainに返します。しかし、最初にサイズを選択すると、形状が選択されます。どちらもmainに 'null 'を返します。 – Helen

+0

'startActivityForResult'と' intent.putExtra(...) 'の違いは何ですか? 'intent.putExtra(size、value)'を意味しますか? – Helen

0

あなたは、単一の意図から複数の物事を更新しようとしている場合、私はあなたが現在のデータをオフに保存する必要があると思いますアクティビティに既に存在する

public void onClickBrush(View view) { 
    Intent intent = new Intent(MainActivity.this, ChangeBrush.class); 
    // intent.putExtra("shape", currentShape); // for example 

    // then, only start one Activity, with a generic request code, not one Activity twice with two codes 

つまり、(一度に1つの値を更新するだけであっても)すべてのデータを変更できる1つのアクティビティを開始します。したがって、次のアクティビティを開始するときに現在の値を保存し、新しい値を更新している間は変更を戻しません。次に、null値を取得すべきではありません。

たとえば、形状ボタンの場合。

public void onClickChangeBrushShape(View view) { 
    String shape = view.getTag().toString(); 

    // return the brush shape to main activity 
    Bundle bundle = new Bundle(); 

    bundle.putString("shape", shape); // Set the new shape 

    bundle.putString("color", color); // I assume you've saved this 
    bundle.putString("size", size); // and this... 

    // You could put string extras into the intent directly, but whatever 
    Intent intent = new Intent(); 
    intent.putExtras(bundle); 
    setResult(Activity.RESULT_OK, intent); 

    finish(); 
} 

別のオプションは、すべての値を格納し、インテントとバンドル忘れてSharedPreferencesを使用しています。

+0

申し訳ありませんあなたの答えを理解できません....もっと説明できますか? thx – Helen

+0

どちらの部分?私はあなたが多くの重複するメソッドと変数を扱っているという例を挙げていましたが、私はSharedPreferencesが優れていると言いました。 –

+0

私はそれが値を送り返し、次にメインの形とサイズを設定する必要があると思うので、SharedPreferencesは役に立ちません。色は別のアクティビティにあります。 – Helen

関連する問題