2016-11-09 2 views
0

Пройдите размер щетки и форму щетки между MainActivity и ChangeBrush.Android - передайте несколько параметров с помощью 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 кнопку в ChangeBrush деятельность, они могли пройти size и shape до MainActivity. В 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 

Кажется, возвращаемое значение может соответствовать правому умыслу. Я не знаю, почему он дважды записывает информацию о форме. Что-то не так с finish()? Я хочу, чтобы пользователь выбирал как размер, так и форму, а затем возвращался к основному виду деятельности.

Если метод неправильный, что мне делать, чтобы передать эти два значения?

+0

Какие кнопки у вас отображены на 'onClickBrush'? Все они? Вы должны разделить кнопки «Размер» и «Форма» на два отдельных намерения. –

+0

@ cricket_007 'onClickBrush' запускает операцию' ChangeBrush'. В деятельности «ChangeBrush» я разделяю размер и форму на два намерения (методы). – Helen

+0

Похоже, что 'onClickBrush' запускает' ChangeBrush' дважды в данный момент. –

ответ

0

Две проблемы я вижу:

1: Вы звоните startActivityForResult дважды. Вы можете использовать дополнительные функции, используя intent.putExtra(...).

2: Вы не имеете break в вашем switch заявлении:

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

Я добавляю 'break' только сейчас, и он будет возвращать только одну форму и один размер. Он работает, когда я сначала выбираю форму, а затем выбираю размер. Он вернет правильное значение в main. Но если я сначала выберу размер, а затем выберите фигуру. Оба они вернут «нуль» на главную. – Helen

+0

В чем разница между использованием 'startActivityForResult' и' intent.putExtra (...) '? Вы имеете в виду 'intent.putExtra (size, value)'? – Helen

0

Если вы пытаетесь обновить несколько вещей из одной Intent, я думаю, что вам нужно сохранить от текущего данные который уже существует в Деятельности.

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 

Другими словами, вы начинаете одну активность, способную изменять все данные (даже если вы только обновить одно значение в то время). Таким образом, сохраните текущие значения при запуске следующего действия, передайте их обратно без изменений при обновлении новых значений. Тогда вы не должны получать нулевые значения.

Например, для кнопки формы.

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