【问题标题】:Going back to previous activity using ActionBar navigation使用 ActionBar 导航返回上一个活动
【发布时间】:2014-09-21 18:08:32
【问题描述】:

在我的应用程序中,我为项目列表建模。在 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 上的“

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

如何将 ListId 从 EditListPropertiesActivity 传回给 DisplayListActivity?

  1. startActivityForResult 并返回 id - 可以,但我觉得很难看
  2. 使用 SharedPreferences 并存储类似 lastVisitedList 的东西 - 丑陋
  3. 将 lastVisitedList 信息存储在 db 中 - 甚至更丑

该问题的通常解决方案是什么?

下面的代码 sn-ps。

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>

【问题讨论】:

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


    【解决方案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)
    
        }
    }
    

    编辑: 阅读 cmets!需要使用 startActivityForResult

    【讨论】:

    • 我正在通过点击 ActionBar 上的“
    • 我检查了 onStop()、onPause() 和 onDestroy()——不幸的是它不起作用。根本没有调用onActivityResult的代码。
    • 是的,有 this one. 虽然您需要确保不要像示例答案那样调用 super.onBackPressed(); 方法。
    • 哦,当您开始活动时,您需要使用startActivityForResult 而不是startActivityHere's an example from Google 了解如何执行此操作,here's one 来自 stackoverflow。
    • 是的,我使用了startActivityForResult。我将尝试使用onBackPressed 方法。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我找到了可行的解决方案。我把它贴在这里,因为它更干净(在我看来)并且与另一个提议的不同。我在清单文件中将第二个活动的启动模式设置为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>
          ...
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多