在Android上启动活动和共享数据

时间:2016-09-28 14:34:02

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

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

问题1:当活动关闭时,MainActivity将重新运行onCreate,所选选项卡将返回启动选项卡。有没有办法继续上次选择的标签?

调用代码是:

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

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

MainActivity:

public class MainActivity extends AppCompatActivity {

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

}

MySettings:

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);
}

5 个答案:

答案 0 :(得分:1)

问题1:

您应该在活动中保存选定的标签索引,这样当它返回时,您可以读取索引并在onCreate调用时选择它。

问题2:

@Luis Miguel Sierra关于SharedPreference的事情是正确的。

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

  

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

     

例如,您的应用可以启动相机应用并接收拍摄的照片。或者,您可以启动People应用程序,以便用户选择联系人,结果您将收到联系人详细信息。

     

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

更多信息: Getting a Result from an Activity

答案 1 :(得分:0)

解决第二个问题

意图的帮助下,您可以将数据表单一个活动转移到另一个

喜欢以下

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以重新选择标签

答案 2 :(得分:0)

如果你想在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);

答案 3 :(得分:0)

第一个问题:     如果它再次运行onCreate,则表示它已被销毁。如果您可以发布tablayout的创建方式,那就太好了。

其次: 要在活动之间共享数据,不应使用SharedPreferences,您应该在intent中传递数据。 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();

答案 4 :(得分:0)

谢谢路易斯,这解决了我的第二个问题。从我使用的第二个活动中

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

而不是

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

再次......感谢每个人的快速反应。