使用ActionBar导航返回上一个活动

时间:2014-09-21 18:08:33

标签: java android android-intent android-activity android-actionbar

在我的应用中,我为项目列表建模。在MainActivity中,我看到包含列表的ListView。我可以单击每个列表以查看其项目(DisplayListActivity)。在DisplayListActivity上,我在ActionBar中有一个按钮来显示列表属性。这将启动第三个活动(EditListPropertiesActivity)。

              Main
              | ^
              V |
      DisplayListActivity (listId is passed with Intent, default=1)
              | ^
              V |
   EditListPropertiesActivity (listId is passed with Intent, default=1)

当我在MainActivity上选择List id = 2时,会出现问题,然后我选择DisplayListActivity上的属性按钮。完成EditListPropertiesActivity后,我点击'<' (返回)在ActionBar上:enter image description here

我返回到DisplayListActivity,但是我没有回到列表id = 2,而是看到id = 1的列表(这是默认值)。

如何将ListId从EditListPropertiesActivity传递回DisplayListActivity?

  1. startActivityForResult并返回id - 会工作,但我看到它很难看
  2. 使用SharedPreferences并存储,如lastVisitedList - 丑陋
  3. 将lastVisitedList信息存储在db中 - 甚至是uglier
  4. 该问题的常用解决方案是什么?

    以下代码段。

    MainActivity

    public class MainActivity extends Activity {
    ...
    listView.setOnItemClickListener(
                new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                        MetaList mlist = (MetaList) listView.getItemAtPosition(i);
    
                        final Intent intent;
                        intent = new Intent(getApplicationContext(), DisplayListActivity.class);
                        intent.putExtra(META_LIST_SELECTED, mlist.getId());
                        startActivity(intent);
                    }
                }
        );
    ...
    

    DisplayListActivity

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_list);
    
        intent = getIntent();
        metaListId = intent.getLongExtra(MainActivity.META_LIST_SELECTED, 1); //read the data or take 1 as default
        ...
        //start the third activity
        final Intent intent;
        intent = new Intent(getApplicationContext(), EditListPropertiesActivity.class);
        intent.putExtra(META_LIST_SELECTED, metaListId);
        startActivity(intent);
        ....
    

    EditListPropertiesActivity

    public class EditListPropertiesActivity extends Activity {
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.edit_list_parameters);
    
        getActionBar().setDisplayHomeAsUpEnabled(true);  //this enables the '<' (back) button 
    
        intent = getIntent();
        metaListId = intent.getLongExtra(DisplayMetaListActivity.META_LIST_SELECTED, 1);
        ...
    

    清单

    <application>
        <activity
                android:name=".MainActivity">
        </activity>
        <activity
                android:name="com.example.tutorial1.DisplayListActivity"
                android:parentActivityName="com.example.tutorial1.MainActivity" >
            <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value="com.example.tutorial1.MainActivity" />
        </activity>
        <activity
                android:name="com.example.tutorial1.EditListPropertiesActivity"
                android:parentActivityName="com.example.tutorial1.DisplayListActivity" >
            <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value="com.example.tutorial1.DisplayListActivity" />
        </activity>
    </application>
    

3 个答案:

答案 0 :(得分:1)

尝试此操作以完成活动

Intent intent = new Intent();
intent.putExtra(EXTRA, value);
setResult(RESULT_OK, output);
finish();

这是用于在上一个活动中获得结果

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

    if(data.getExtras().containsKey(EXTRA)){

       // do stuff with data from finished activity

       String bla = data.getStringExtra(EXTRA)

    }
}

编辑:阅读评论!需要使用startActivityForResult

答案 1 :(得分:0)

尝试调用finish();您应该调用当前活动的销毁并显示之前的活动。

答案 2 :(得分:0)

我找到了有效的解决方案。我在这里发布,因为它更清晰(在我看来)并且与其他提议的不同。我在清单文件中将第二个活动的启动模式设置为singleTask:android:launchMode="singleTask"

    ...
    <activity
        android:name="com.example.tutorial1.DisplayListActivity"
        android:label="Meta List"
        android:parentActivityName="com.example.tutorial1.MainActivity"
        android:launchMode="singleTask">
        <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.tutorial1.MainActivity" />
    </activity>
    ...

如果对所述问题有更好的解决方案,我愿意讨论:)