【问题标题】:How to manage activity with startActivityForResult如何使用 startActivityForResult 管理活动
【发布时间】:2016-05-12 12:32:25
【问题描述】:

我遇到了这样的情况:

Activity A --> B --> C --> D,当 D 完成后,我必须刷新 ActivityA 以显示我在 ActivityB 、 ActivityC 和 ActivityD 中输入的内容。这是我的代码:

活动A

    @OnClick(R.id.btn_one)
    public void toActivityB(){
        Intent intent = new Intent();
        intent.setClass(this, ActivityB.class);
        startActivityForResult(intent, 1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == RESULT_OK){
            String b = data.getStringExtra("b");
            String c = data.getStringExtra("c");
            String d = data.getStringExtra("d");
            tvAll.setText(etOne.getText().toString() + "\n" + b + "\n" + c + "\n" + d);
        }
    }

活动B

    @OnClick(R.id.btn_two)
    public void toActivityC(){
        Intent intent = new Intent();
        intent.setClass(this, ActivityC.class);
        startActivityForResult(intent, 2);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 2 && resultCode == RESULT_OK){
            data.putExtra("b", etTwo.getText().toString());
            setResult(RESULT_OK, data);
            finish();
        }
    }

ActivityC代码和ActivityB一样,最后一个ActivityD如下:

    @OnClick(R.id.btn_four)
    public void returnToActivityA(){
        Intent intent = new Intent();
        intent.putExtra("d", etFour.getText().toString());
        setResult(RESULT_OK, intent);
        finish();
    }

这样,我可以得到ActivityB,ActivityC,ActivityD中的输入值。但是我必须在每个Activity中重写onActivityResult方法,并逐个处理数据。有没有其他简单的方法我可以处理这种情况?有什么好的建议我将不胜感激。

【问题讨论】:

  • 你能举个例子说明你到底想达到什么目标,为什么你需要不同的活动来获得一些输入
  • 您可以制作一些公共静态变量以在不同的活动之间共享。
  • @Freddy 你可以Intent 将数据从一个活动传递到另一个活动。
  • @AvinashJoshi 例如,用户必须输入 3 或 4 页关于他们的信息才能应用某些东西。当他们在最后一页完成时,我们需要显示他们在第一页写的内容。像这样。
  • @AnandKumarJha 当然,静态变量可以做到,但我认为当你存储很多东西时使用静态变量,这对内存不好。

标签: android android-activity onactivityresult startactivityforresult


【解决方案1】:

我建议您使用单个活动并使用片段作为表单来输入数据,一旦收集了所有数据,您可以根据要保存的数据将其保存在共享首选项或 SQLITE 数据库中,然后开始新的显示存储数据的活动

创建一个 parceleble 对象并将这个对象发送到新的 Activity 并在那里显示。

【讨论】:

    【解决方案2】:

    您可以使用Intent.FLAG_ACTIVITY_FORWARD_RESULT 将“目标”Activity 从一个Activity 传递到下一个Activity。如果你启动 ActivityC 例如:

    @OnClick(R.id.btn_two)
    public void toActivityC(){
        Intent intent = new Intent();
        intent.setClass(this, ActivityC.class);
        intent.setFlag( Intent.FLAG_ACTIVITY_FORWARD_RESULT );
        startActivityForResult(intent, 2);
    }
    

    这样,新活动可以调用 setResult(int) 并将结果发送回原始活动的回复目标。

    (引自Intentdocumentation

    在您的情况下,这也意味着每个 ActivityBC)都必须传递迄今为止收集的数据以及 Intent用于开始下一个Activity。最后,ActivityD可以调用setResult()将数据传输给ActivityA

    编辑 (1) 我正在添加一些代码来演示如果用户按下 BACK 键如何做出反应。为简单起见,我们假设用户只决定在 ActivityD 中按 BACK。

    编辑 (2) 请注意,Intent.putExtra() 可以采用 Bundle,因此您可以将整个 Bundle 与您的所有数据一起传递,而不是将所有值一个一个地传输到新的Intent。使用一个 Bundle extra 而不是其他几个 extra 可以减少代码行数。

    xml 文件

    activity_a.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
        <TextView
            android:text="Results:"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"/>
    
        <TextView
            android:id="@+id/tv_result1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="---"/>
    
        <TextView
            android:id="@+id/tv_result2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="---"/>
    
        <TextView
            android:id="@+id/tv_result3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="---"/>
    
        <Button
            android:id="@+id/btn_get_results"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Get results!"/>
    
    </LinearLayout>
    

    activity_b.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
        <TextView
            android:text="The following text will be sent as result:"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ff0000"
            android:text="Forwarding Results"/>
    
        <Button
            android:id="@+id/btn_get_results"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Get more results!"/>
    
    </LinearLayout>
    

    activity_c.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
        <TextView
            android:text="The following text will be sent as result:"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ff00ff"
            android:text="is"
            android:checked="true"
            android:id="@+id/cb_result"/>
    
        <Button
            android:id="@+id/btn_get_results"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Get more results!"/>
    
    </LinearLayout>
    

    activity_d.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
        <TextView
            android:text="The following text will be sent as result:"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#0000ff"/>
    
        <Button
            android:id="@+id/btn_send_results"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Send all results!"/>
    
    </LinearLayout>
    

    活动

    活动A

    public class ActivityA extends AppCompatActivity
    {
        static final int REQUEST_CODE = 42;
    
        static final String KEY_RESULT_FROM_B = "result_b";
        static final String KEY_RESULT_FROM_C = "result_c";
        static final String KEY_RESULT_FROM_D = "result_d";
    
        private TextView tvResult1, tvResult2, tvResult3;
        private Button btnGetResults;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
    
        tvResult1 = (TextView) findViewById(R.id.tv_result1);
        tvResult2 = (TextView) findViewById(R.id.tv_result2);
        tvResult3 = (TextView) findViewById(R.id.tv_result3);
    
        btnGetResults = (Button) findViewById(R.id.btn_get_results);
        btnGetResults.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                startActivityForResult(new Intent(ActivityA.this, ActivityB.class), REQUEST_CODE);
            }
        });
    
    }
    
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if (REQUEST_CODE == requestCode)
        {
            if (resultCode == RESULT_OK)
            {
                tvResult1.setText(data.getStringExtra(KEY_RESULT_FROM_B));
                tvResult2.setText(data.getStringExtra(KEY_RESULT_FROM_C));
                tvResult3.setText(data.getStringExtra(KEY_RESULT_FROM_D));
                btnGetResults.setEnabled(false);
            }
            else
            {
                Toast.makeText(ActivityA.this, "no result", Toast.LENGTH_SHORT).show();
                // do something else
            }
        }
    }
    }
    

    活动B

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
    
        TextView tvResult = (TextView) findViewById(R.id.tv_result);
        final String result = tvResult.getText().toString();
    
        Button btnGetResults = (Button) findViewById(R.id.btn_get_results);
        btnGetResults.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(ActivityB.this, ActivityC.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
    
                intent.putExtra(ActivityA.KEY_RESULT_FROM_B, result);
                startActivity(intent);
                finish();
            }
        });
    }
    

    活动C

    public class ActivityC extends AppCompatActivity
    {
        static final String IS ="is";
        static final String IS_NOT = "is not";
    
        private CheckBox cbResult;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_c);
    
        cbResult = (CheckBox) findViewById(R.id.cb_result);
        cbResult.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
            {
                buttonView.setText(isChecked ? IS : IS_NOT);
            }
        });
    
        String previousResult = getIntent().getStringExtra(ActivityA.KEY_RESULT_FROM_C);
        cbResult.setChecked( ! IS_NOT.equals(previousResult) );
    
        final String result1 = getIntent().getStringExtra(ActivityA.KEY_RESULT_FROM_B);
    
        Button btnGetResults = (Button) findViewById(R.id.btn_get_results);
        btnGetResults.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(ActivityC.this, ActivityD.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
                intent.putExtra(ActivityA.KEY_RESULT_FROM_B, result1);
                String result2= cbResult.getText().toString();
                intent.putExtra(ActivityA.KEY_RESULT_FROM_C, result2);
                startActivity(intent);
                finish();
            }
        });
    }
    }
    

    活动D

    public class ActivityD extends AppCompatActivity
    {
        static final String POSSIBLE = "possible :)";
        static final String COMPLICATED = "complicated";
    
        private String result1, result2;
    
        private TextView tvResult;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_d);
    
        tvResult = (TextView) findViewById(R.id.tv_result);
        result1 = getIntent().getStringExtra(ActivityA.KEY_RESULT_FROM_B);
        result2 = getIntent().getStringExtra(ActivityA.KEY_RESULT_FROM_C);
    
        if (ActivityC.IS.equals(result2))
        {
            tvResult.setText(POSSIBLE);
        }
        else
        {
            tvResult.setText(COMPLICATED);
        }
    
    
        Button btnSendResults = (Button) findViewById(R.id.btn_send_results);
        btnSendResults.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
    
                intent.putExtra(ActivityA.KEY_RESULT_FROM_B, result1);
                intent.putExtra(ActivityA.KEY_RESULT_FROM_C, result2);
                intent.putExtra(ActivityA.KEY_RESULT_FROM_D,  tvResult.getText().toString());
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
    
    @Override
    public void onBackPressed()
    {
        // start ActivityC once more
        Intent intent = new Intent(ActivityD.this, ActivityC.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
    
        intent.putExtra(ActivityA.KEY_RESULT_FROM_B, result1);
        // pass this to set the CheckBox like the user left it:
        intent.putExtra(ActivityA.KEY_RESULT_FROM_C, result2);
        startActivity(intent);
        finish();
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-22
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多