【问题标题】:Starting activities and sharing data on Android在 Android 上启动活动和共享数据
【发布时间】:2016-09-28 14:34:01
【问题描述】:

我是 Android 编程新手,遇到了一个无法克服的问题。我已经使用 Android Studio 示例构建了一个 TabHost 应用程序。当用户按下按钮时,我想调用另一个显示设置页面的活动(我从 gui 创建了一个基本活动“MySettings”)。

问题1:当activity关闭时,MainActivity重新运行onCreate,并且选中的选项卡回到启动选项卡。有没有办法在最后选择的选项卡上继续?

调用代码是:

public void buttonPressed(View view) { 
Intent intent = new Intent(MainActivity.this,MySettings.class);
MainActivity.this.startActivity(intent);
}

问题 2:我无法在两个活动之间共享数据:

主活动:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences sharedpreferences =     PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = sharedpreferences.edit();

}

我的设置:

public class MySettings extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings_inr);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    SharedPreferences sharedpreferences =   PreferenceManager.getDefaultSharedPreferences(this);

    sharedpreferences.edit().putInt("myvar",200);
    sharedpreferences.edit().apply();
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
};

此代码运行,但当 MySettings 活动关闭时,调用活动 MainActivity 中的“myvar”未更新。

public void setImage(){
    SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(this);
    int cvt=sharedpreferences.getInt("myvar",0);
}

【问题讨论】:

    标签: java android android-activity sharedpreferences android-tabhost


    【解决方案1】:

    问题 1:

    您应该将选定的选项卡索引保存在您的活动中,以便当它返回时,您可以读取索引并在调用 onCreate 时选择它。

    问题 2:

    @Luis Miguel Sierra 对 SharedPreference 的看法是正确的。

    但您可能希望“startActivityForResult”将数据传回第一个活动。

    开始另一项活动不一定是单向的。您还可以开始另一个活动并收到返回的结果。要接收结果,请调用 startActivityForResult()(而不是 startActivity())。

    例如,您的应用可以启动相机应用并接收拍摄的照片。或者,您可以启动“人脉”应用,以便用户选择联系人,然后您将收到联系人详细信息。

    当然,响应的活动必须设计为返回结果。当它这样做时,它将结果作为另一个 Intent 对象发送。您的活动在 onActivityResult() 回调中接收它。

    更多信息: Getting a Result from an Activity

    【讨论】:

      【解决方案2】:

      第二个问题的解决方案

      Intent 的帮助下,您可以将数据从一个 Activity 传输到另一个 Activity

      喜欢关注

      public void buttonPressed(View view) { 
      Intent intent = new Intent(MainActivity.this,MySettings.class);
      intent.putExtra("key","value");
      MainActivity.this.startActivity(intent);
      }
      

      在第二个活动中

      String value=getIntent().getStrigExtras("key");
      

      将返回值

      第一个问题的解决方案

      您应该保存已选择选项卡的位置,当您返回该活动时,将此位置分配给 tabhost 以重新选择您的选项卡

      【讨论】:

        【解决方案3】:

        如果你想在BackPress上设置当前选定的标签,那么只需保存选定的标签索引,你可以使用下面的代码重置它

        viewPager.setCurrentItem(index);
        

        如果您希望将第一个活动收到的所有数据都发送到第二个活动,那么您可以使用以下代码通过 Intent 发送数据

         Intent intent=new Intent(CurrentActivity.this,SecondActivity.class);
            intent.putExtra("id", iddata);
            intent.putExtra("title", titledata); 
            startActivity(intent);
        

        在 SecondActivity 中接收通过 Intent 发送的数据的代码

         Bundle b=getIntent().getExtras();
            String id=b.getString(id);
        

        【讨论】:

          【解决方案4】:

          第一个问题: 如果它再次运行 onCreate ,则意味着它已被销毁。如果你能发布你的 tablayout 是如何创建的,那就太好了。

          其次: 为了在您不应该使用 SharedPreferences 的活动之间共享数据,您应该在意图中传递数据。 SharedPreferences 旨在在您的应用中存储持久数据。

          所以它应该如下所示:

          Intent intent = new Intent(MainActivity.this, MySettings.class);
          intent.putExtra(MySettings.PARAM, "200");
          MainActivity.this.startActivity(intent);
          

          并在您的 MySettings 中检索它,如下所示:

           public class MySettings extends AppCompatActivity {
              public static final String PARAM = "myvar";
          
             @Override
             protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_settings_inr);
          
                  String param = getIntent().getStringExtras(PARAM);
          }
          

          第三个:

          您的 var 没有被保存,因为每次调用 edit() 时,它都会创建一个 Editor 的新实例,因此不会保存任何值。所以只需要改变

          SharedPreferences sharedpreferences =   PreferenceManager.getDefaultSharedPreferences(this);
          
              sharedpreferences.edit().putInt("myvar",200);
              sharedpreferences.edit().apply();
          

          进入

          SharedPreferences sharedpreferences =   PreferenceManager.getDefaultSharedPreferences(this);
          
              sharedpreferences.edit().putInt("myvar",200).apply();
          

          【讨论】:

            【解决方案5】:

            谢谢 Luis,这解决了我的第二个问题。在我使用的第二个活动中

            sharedpreferences.edit().putInt("myvar",200).commit();
            

            代替

                sharedpreferences.edit().putInt("myvar",200);
                sharedpreferences.edit().commit();
            

            再次...感谢大家的快速回复。

            【讨论】:

            • 很高兴它有帮助。我会使用 apply() 来使其异步。关于是否要使用 sharedpreferences 的问题,请考虑以下问题:如果下次打开应用程序时需要显示在设置中所做的更改,那么这是可行的方法。在其他情况下,它是暂时的,所以它不是最好的解决方法。如果你是第二种情况,你应该再次使用intenta。搜索 startActivityForResult 看看如何实现。那里有很多例子。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多