【问题标题】:Passing and keeping data through activities通过活动传递和保存数据
【发布时间】:2018-08-21 11:52:52
【问题描述】:

我有三项活动。

  • 设置活动 [A] // 您在其中输入将在主活动中使用的数字
  • 主要活动 [B] // 它使用设置活动输​​入的数字
  • 暂停活动 [C] // 这是暂停主要活动并提供重置选项的对话框

我的问题是我无法找到一种方法将该号码从 A 传递到 B,并且当用户从 C 重置 B 时保存该号码。我尝试了一些方法,但我无法使其工作。 我的代码:

答:

long npsum = npint * 60000 + np3int * 1000;
Intent cardintent = new Intent(getApplicationContext(), card_game_2.class);
cardintent.putExtra("card2string",npsum);
startActivity(cardintent);

乙:

Bundle card2extras = getIntent().getExtras();
    if (card2extras != null) {
        String startcardstring = card2extras.getString("card2string");
        startcard = Long.parseLong(startcardstring);

    }

C:

Intent resetintent = new Intent(card_2_pause.this, card_game_2.class);
startActivity(resetintent);

感谢您的帮助

【问题讨论】:

标签: java android android-studio android-activity


【解决方案1】:

您可以在启动 Pause Activity C 时使用 startActivityForResult()。 startActivityForResult() 使您能够将数据发送到接收活动,在您的情况下为 MainActivity C。请参阅tutorial here

【讨论】:

  • 你能举个例子吗?
【解决方案2】:

修复它。新代码:

答:

 Intent timerdintent = new Intent(timer_settings.this, timer_2.class);
 Bundle timer2extras = new Bundle();
 timer2extras.putString("timer2string", String.valueOf(npsum));
 timerdintent.putExtras(timer2extras);
 startActivity(timerdintent);

乙:

SharedPreferences pref = getApplicationContext().getSharedPreferences("timer2stringpref", MODE_PRIVATE);
    Bundle timer2extras = getIntent().getExtras();
    if (timer2extras != null) {
        String timer2string = timer2extras.getString("timer2string");
        starttimer = Integer.parseInt(timer2string);
        SharedPreferences.Editor editor = pref.edit();
        editor.putInt("value", starttimer);
        editor.apply();

    } else {
        int starttimerx = pref.getInt("value", 0);
        starttimer = starttimerx;
    }

C:

Intent resetintent = new Intent(timer_2_pause.this, timer_2.class);
startActivity(resetintent);

【讨论】:

    【解决方案3】:

    你也可以设置一个(Data)Fragment来交换数据?

    在其 onCreate 集中 setRetainInstance(true);

    为您的 card2string 添加一些 setter/getter 方法

    并在不同的活动中通过以下方式获取它的实例:

    在例如主活动

      public final static String DATAFRAG = "DATA";//public so you can use it from any Activity
    

    在例如onCreate 或您需要数据的地方:

     FragmentManager fm = getFragmentManager();
        dataFrag = (DataFragment) fm.findFragmentByTag(MainActivity.DATAFRAG);
        if (dataFrag == null)
        {
            dataFrag = new DataFragment();
            dataFrag.setCard2String("something");
            fm.beginTransaction().add(dataFrag, MainActivity.DATAFRAG).commit();
        }
    

    确保在 DataFragment 中覆盖

        @Override
    public void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
    }
    

    并且在 onCreate 中使用 Bundle 来保存和恢复您的数据,以防 Fragment 被破坏...

    HTH

    【讨论】:

    • 您能否更具体一些,因为当您在 Create id 上说时无法理解您的意思是什么活动
    • setRetainInstance 会阻止 Fragment 被收集,所以它需要在 Fragment 的 OnCreate 中,并且要获取对 datafragment 的引用,以及在参与交换的每个 Activity 中,您需要调用 Fragmentmanager 来获取它...恕我直言,最好的方法是将该调用放在 onCreate 中,但您也可以将它放在您真正需要它的地方,嗯,是的,如果您想传播数据更改的事件,您还需要一个侦听器接口,并在 DataFragment 中列出要通知的侦听器,请注意在这种情况下您处于哪个线程中
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 2022-12-09
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多