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 中完成。希望这能解决您的问题。
我在从详细信息页面返回到其父页面时遇到问题。问题是它是三个级别,问题是从第三级回到第二级。 想象一下发票清单。点击其中一个,它会加载发票的详细信息以及发票中的行项目列表。点击一个订单项,它会转到第三个 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 中完成。希望这能解决您的问题。