Android大师详细信息

时间:2017-06-03 22:48:33

标签: android master-detail

我遇到了从详细信息页面返回其父级的问题。问题在于它是三个级别,问题是从第三级回到第二级。 想象一下发票清单。点击其中一个,然后使用发票中的订单项列表加载发票的详细信息。点击订单项,然后转到第三个活动,其中包含该订单项的详细信息。该订单项是通过点按响应启动的,如此...

[编辑添加了清单信息]

<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);,以便它可以返回发票列表。订单项详细信息页面具有相同的行,以允许后退按钮转到发票。

当我点击订单项明细活动上的后退按钮时,它无法加载发票,因为它没有从原始列表中传入的发票编号。

我知道我可以覆盖onBackPressed并创建一个启动其父级的intent而不是让框架执行它。我的问题是,在父子导航的情况下,框架所保留的任何内部视图堆栈都会陷入困境吗?是否有其他方法可以跟踪主视图中的项目,以便从详细视图返回时可以使用正确的内容重新加载?

TIA 麦克

2 个答案:

答案 0 :(得分:2)

从代码片段和描述中,我可以理解后面的堆栈就像

InvoiceListActivity - &gt; InvoiceDetailsActivity - &gt; InvoiceItemDetailActivity。

现在覆盖每个子活动中的onOptionsItemSelected方法。

例如:在InvoiceItemDetailActivity类中,覆盖如下所示的方法。

@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中完成。希望这能解决你的问题。

答案 1 :(得分:0)

首先,它看起来像你的第二个活动被摧毁了。这就是为什么当您返回新实例时,没有发票号码。要解决此问题,您可以通过覆盖onSaveInstanceStateonRestoreInstanceState来保存第二个活动状态(发票号等)。然后你可以保存你的第二个活动状态,并从第三个回来时恢复它。

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