gpt4 book ai didi

android - 在主/详细 fragment 中使用 ActionBar Up Navigation

转载 作者:IT老高 更新时间:2023-10-28 23:24:12 27 4
gpt4 key购买 nike

我有一个具有主/详细布局的应用程序(1 个 Activity 、1 个 ListView fragment 和 1 个详细 fragment )。当用户单击 ListView 中的项目时, fragment 事务会在右侧 Pane 中实例化一个详细 fragment ,其中包括与该项目对应的信息。当显示细节 fragment 时,我隐藏了初始操作栏按钮/项目并显示 3 个新的 AB 项目(完成/删除/取消)。用户可以通过按下后退按钮或按下 3 个 AB 项之一来清理右 Pane 并返回到初始 UI 状态。

我遇到的问题是,当用户选择应用程序的主页图标(即“向上导航”)时, Activity 会重新加载(即指示 Activity 正在启动的动画可以被视为操作栏和UI 已重绘)。该问题仅在按下应用程序主页图标时发生。如果用户按下后退按钮或取消/完成/删除操作栏按钮, fragment 会简单地从右 Pane 中移除,并且 UI 会返回初始状态而无需任何“重新加载”。

Activity 的 XML 布局如下(在 LinearLayout 内;美化隐藏了该行):

<fragment class="*.*.*.ListFragment"
android:id="@+id/titles" android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent" />

<FrameLayout android:id="@+id/details" android:layout_weight="2"
android:layout_width="0px"
android:layout_height="match_parent" />

DetailsFragement 在其 onCreate 方法中有 actionBar.setDisplayHomeAsUpEnabled 语句:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);


ActionBar actionBar = getSherlockActivity().getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

}

对于 ListView fragment 和 Detail fragment ,onCreateOptionsMenu() 和 onOptionsItemSelected() 方法都在 fragment 中实现。在详细信息 fragment 的代码下方:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.edit_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

// some variable statements...

switch (item.getItemId()) {
case android.R.id.home:
//Toast.makeText(getSherlockActivity(), "Tapped home", Toast.LENGTH_SHORT).show();
onHomeSelectedListener.onHomeSelected();
return true;

case R.id.menu_edit_item_done:
editedTask.setTitle(editedTaskTitle);
onTaskEditedListener.onTaskEdited(editedTask, UPDATE_TASK, true);
return true;

default:
return super.onOptionsItemSelected(item);

}
}

在主机 Activity 中,我实现了 onHomeSelectedListner 来处理应用主页图标按下(即“向上导航”:

public void onHomeSelected(){

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
TaskFragment taskFragment = (TaskFragment)getSupportFragmentManager().findFragmentById(R.id.details);
ft.remove(taskFragment);
ft.commit();
manager.popBackStack();

}

负责处理所有其他操作栏按钮(即完成/删除/取消)的 Activity 监听器是 onTaskEditedListener,除了处理某些数据的其他代码之外,它具有与上面显示的相同的 fragment 事务。

更新(1/24)
根据 tyczj 和 straya 的反馈,我在 Activity 的 onCreate()、onResume()、onPause() 中放置了日志语句,以确定 onHomeSelected 和 onTaskEdited 监听器之间的差异。我能够确认在“向上导航”事件(即 onHomeSelected)期间调用了 onPause()、onCreate() 和 onResume()。而在 onTaskEdited 调用期间(即后退按钮或完成/删除/取消按下)没有调用这些事件。

更新 (1/25)
根据 Mark Murphy 的建议,我在“case android.R.id.home”语句中注释掉了 onHomeSelected 方法调用,只是为了看看 Activity 会做什么。当时的想法是,应用程序不会做任何事情,因为 are no 语句。事实证明并非如此。即使没有调用监听器方法(即删除 fragment ), Activity 也会重新启动,并且从 fragment 容器中删除详细 fragment 。

更新 (2/28)
我暂时解决了我的主要 Activity 通过禁用窗口动画重新启动的事实(如我自己的答案中突出显示的那样)。然而,通过进一步的测试,我发现了一个错误。感谢 Wolfram Rittmeyer 的示例代码,我能够找出我的 Activity 在向上导航期间重新启动(在主/细节单一布局中)的真正原因:
1) 尽管我使用此“onHomeSelectedListener”从后台堆栈中正确删除 fragment ,但在 ListView fragment 的 onOptionsItemSelected 中仍有一些剩余代码创建了启动托管 Activity 的新 Intent 。这就是为什么按下应用程序的主页图标会重新启动 Activity 。
2)在我的最终实现中(如我自己的答案所示),我摆脱了 Activity 中的 onHomeSelectedListener 并替换了 ListView 的 onOptionsItemSelected 内的 startActivity Intent (即违规代码),以使用最初在 onHomeSelectedListener 中的 fragment 删除 + popBackStack 代码。

最佳答案

经过大量研究和探索,事实证明,我的 Activity 在主/详细配置的“向上导航”期间重新启动的唯一原因是因为我在 ListView Fragment 的 onOptionsItemSelected 中留下了一些代码,该代码另外创建了启动主要 Activity 的 Intent 到我在别处的完整 fragment 交易代码。下面是我在手机(多个 Activity )和平板电脑(单个 Activity/多 Pane )配置上正常工作的“向上导航”的最终实现。感谢 Wolfram Rittmeyer他的代码中的一些提示(评论部分中的链接)可以帮助我查明我的问题!

主要 Activity :托管 fragment 并执行其他一些特定于应用程序的操作

ListView fragment :处理表格配置中的“向上导航”

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if(mDualPane){
FragmentManager manager = getSherlockActivity().getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
DetailFragment detailFragment = (DetailFragment)manager.findFragmentById(R.id.details);
ft.remove(detailFragment);
ft.commit();
manager.popBackStack();
getSherlockActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSherlockActivity().getSupportActionBar().setHomeButtonEnabled(false);
}
return true;

// Other case statements...

default:
return super.onOptionsItemSelected(item);
}
}

详细信息 fragment :在电话配置中处理导航

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);

// Sets "up navigation" for both phone/tablet configurations
ActionBar actionBar = getSherlockActivity().getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {
case android.R.id.home:
if(!mDualPane){
Intent parentActivityIntent = new Intent(getSherlockActivity(), MainActivity.class);
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
getSherlockActivity().finish();
}
return true;

// Other case statements...

default:
return super.onOptionsItemSelected(item);
}

}

关于android - 在主/详细 fragment 中使用 ActionBar Up Navigation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14472044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com