Android master detail 细节

Android master detail detail

我在从详细信息页面返回到其父页面时遇到问题。问题是它是三个级别,问题是从第三级回到第二级。 想象一下发票清单。点击其中一个,它会加载发票的详细信息以及发票中的行项目列表。点击一个订单项,它会转到第三个 activity,其中包含该订单项的详细信息。订单项通过点击响应启动,如下所示...

[编辑添加清单信息]

<activity
    android:name=".InvocieListActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.NoActionBar">
</activity>

<activity
    android:name=".InvoiceDetailActivity"
    android:label="@string/title_activity_invoice_detail"
    android:parentActivityName=".InvoiceListActivity"
    android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.myweb.ree.InvocieListActivity"/>
</activity>

<activity
    android:name=".InvoiceItemDetailActivity"
    android:label="@string/title_activity_invoiceitem_detail"
    android:parentActivityName=".InvoiceDetailActivity"
    android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.myweb.ree.InvoiceDetailActivity"/>
</activity>

private BroadcastReceiver invoiceItemReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ACTION_INVOICEITEM_TAPPED)) {
            String invoiceItemId = intent.getStringExtra(Constants.MSG_DATA);
            if (invoiceItemId != null && invoiceItemId.length() > 0) {
                launchInvoiceItemActivity(invoiceItemId);
            }
        }
    }
};

private void launchInvoiceItemActivity(String invoiceItemId) {
    Intent intent = new Intent(this, InvoiceItemDetailActivity.class);
    intent.putExtra(ARG_InvoiceItem_ID, invoiceItemId);
    this.startActivity(intent);
}

发票详细信息具有 getSupportActionBar().setDisplayHomeAsUpEnabled(true);,因此它可以 return 到发票列表。行项目详细信息页面具有相同的行以允许后退按钮转到发票。

当我点击行项目详细信息上的后退按钮时 activity 它无法加载发票,因为它没有从原始列表中传入的发票编号。

我知道我可以重写 onBackPressed 并创建一个启动其父级的意图,而不是让框架执行它。我的问题是,在父子导航的情况下,这是否会弄乱框架保留的任何内部视图堆栈?有没有其他方法可以让我在主视图中跟踪项目,以便在从详细视图 return 时可以重新加载正确的内容?

TIA 麦克

首先,您的第 2 个 Activity 似乎被摧毁了。这就是为什么当您返回时新实例没有发票编号。要解决此问题,您可以通过覆盖 onSaveInstanceState and onRestoreInstanceState 来保存第二个 Activity 状态(发票编号等)。然后你可以保存你的第二个 activity 状态并在从第三个返回时恢复它。

您也可以将发票编号保存到 SharedPreferences。但是每次使用不同的发票编号启动此 Activity 时,您都需要更新它的值以保持一致性。您可以在 onCreate() or/and in onNewIntent() 中执行此操作,具体取决于 Activity 配置。并在 onResume().

中读取此值

从代码片段和描述中,我可以理解返回堆栈将像

InvoiceListActivity -> InvoiceDetailsActivity -> InvoiceItemDetailActivity。

现在重写每个子 activity 中的 onOptionsItemSelected 方法。

例如:在 InvoiceItemDetailActivity class 中,重写如下所示的方法。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
   // this will finish the current activity. and as the activity behind this in the back stack is InvoiceDetailsActivity, the same will just be resumed.
        finish();
        return true;
}
return super.onOptionsItemSelected(item);

}

同样可以在 InvoiceDetailsActivity 中完成。希望这能解决您的问题。