【问题标题】:How to edit ArrayList in MainActivity from second activity [closed]如何从第二个活动编辑 MainActivity 中的 ArrayList [关闭]
【发布时间】:2020-09-27 08:34:36
【问题描述】:

我在MainActivity 中有一个ArrayList,我想在ActivityB 中修改该列表。我将如何实现这一目标?

我当前的解决方案是我将ArrayList 设为静态变量,以便我可以使用MainActivity.ArrayListActivityB 中访问它。但是,我已经看到这可能不是好的做法,也不是很好的信息隐藏。此列表是我拥有的唯一静态变量。我可以继续使用这种方法还是如果我做其他事情会更好?如果是这样,我还能怎么做?

【问题讨论】:

  • 你不应该有一个 ArrayList 开始的活动中的数据。检查干净的架构。
  • @m0skit0 这就是我大学实验室的情况,所以我就照着做了。有什么办法可以让它更加面向对象吗?
  • 过于宽泛,无法在此解释。检查干净的架构:) 例如here.

标签: java android arraylist android-activity


【解决方案1】:

也许您可以尝试将此数组从MainActivity 发送到SecondActivty 和您的SecondActivity,当您以您想要的方式更改该数组时您可以将其发送回MainActivity?这是示例代码,我将int(名为myValue)从MainActivity 发送到SecondActivity 并在那里更改。然后发回MainActivity

主活动:

public class MainActivity extends AppCompatActivity
{
    private static final int LAUNCH_SECOND_ACTIVITY = 1;
    public static final String MY_VALUE_KEY = "MY_VALUE_KEY";
    private int myValue = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("MyTag", "MAIN ACTIVITY. On create, myValue = " + myValue);

        findViewById(R.id.buttonGoToSecond).setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                startSecondActivity();
            }
        });
    }

    private void startSecondActivity()
    {
        Intent i = new Intent(this, SecondActivity.class);
        i.putExtra(MY_VALUE_KEY, myValue);
        startActivityForResult(i, LAUNCH_SECOND_ACTIVITY);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == LAUNCH_SECOND_ACTIVITY)
        {
            if (resultCode == Activity.RESULT_OK)
            {
                myValue = data.getIntExtra(MY_VALUE_KEY, -1);
                Log.d("MyTag", "MAIN ACTIVITY. Result, myValue = " + myValue);
            }
            else if (resultCode == Activity.RESULT_CANCELED)
            {
                Log.d("MyTag", "No result");
            }
        }
    }
}

第二个活动:

public class SecondActivity extends AppCompatActivity
{
    private int dataFromMain;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        // Get data from MainActivity
        dataFromMain = getIntent().getIntExtra(MainActivity.MY_VALUE_KEY, -1);
        Log.d("MyTag", "SECOND ACTIVITY. Data retrieved: " + dataFromMain);


        //Do something with data
        dataFromMain *= 2;

        findViewById(R.id.buttonGoToMain).setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                goToMain();
            }
        });
    }

    private void goToMain()
    {
        Intent returnIntent = new Intent();
        Log.d("MyTag", "SECOND ACTIVITY. Data send back: " + dataFromMain);
        returnIntent.putExtra(MainActivity.MY_VALUE_KEY, dataFromMain);
        setResult(Activity.RESULT_OK, returnIntent);
        finish();
    }
}

日志如下所示:

D/MyTag: MAIN ACTIVITY. On create, myValue = 1
D/MyTag: SECOND ACTIVITY. Data retrieved: 1
D/MyTag: SECOND ACTIVITY. Data send back: 2
D/MyTag: MAIN ACTIVITY. Result, myValue = 2

【讨论】:

  • 感谢您的回答,这是一个很好的解决方案。我有一个简单的问题,在 SecondActivity 完成后会调用 onActivityResult 吗?
  • 是的,它在SecondActivity 完成后调用。在文档中,您可以阅读:当您启动的活动退出时调用,为您提供启动它的requestCode,返回resultCode,以及其中的任何其他数据。 resultCode 将是 RESULT_CANCELED 如果活动明确返回,没有返回任何结果,或在其操作期间崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多