我遇到了从详细信息页面返回其父级的问题。问题在于它是三个级别,问题是从第三级回到第二级。 想象一下发票清单。点击其中一个,然后使用发票中的订单项列表加载发票的详细信息。点击订单项,然后转到第三个活动,其中包含该订单项的详细信息。该订单项是通过点按响应启动的,如此...
[编辑添加了清单信息]
<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 麦克
答案 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)
首先,它看起来像你的第二个活动被摧毁了。这就是为什么当您返回新实例时,没有发票号码。要解决此问题,您可以通过覆盖onSaveInstanceState和onRestoreInstanceState来保存第二个活动状态(发票号等)。然后你可以保存你的第二个活动状态,并从第三个回来时恢复它。
您也可以将发票号码保存到SharedPreferences。但是,每次使用不同的发票编号启动此活动时,您都需要更新它的值以保持一致性。您可以在onCreate()
或/和onNewIntent()
中执行此操作,具体取决于Activity
配置。并在onResume()
中读取此值。