gpt4 book ai didi

android - 在屏幕旋转时切换 ListView ChoiceMode 时的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:00 25 4
gpt4 key购买 nike

我正在尝试基于 example code 构建一个拆分 Pane 在关于 fragment 的 Android 文档末尾提供,基本上是一个包含两个 fragment 的 LinearLayout(所有细节都可以在上面的链接中找到):

  • TitlesFragment 显示标题列表
  • DetailsFragment 显示当前选中标题的详细信息

我的问题是发生了以下意外行为:

  1. 我以横向方向启动应用程序:标题列表显示在左侧,当前所选标题(开头的第一个)的详细信息显示在右侧。<
  2. 我从标题列表中选择项目 X:由于 ListView 设置为 CHOICE_MODE_SINGLE 并且其项目实现了 Checkable,因此标题会突出显示界面。
  3. 我切换到纵向方向(通过旋转设备或模拟器):正如预期的那样,在此配置中仅显示标题列表并且未选择任何项目,因为 ListView 被重新创建并且通过默认情况下,它设置为 CHOICE_MODE_NONE
  4. 我从标题列表中选择项目 Y:正如预期的那样,将显示一个仅显示与所做选择相对应的 DetailsFragment 的 Activity 。
  5. 我切换回横向方向(这里是意外行为发生的地方):右侧的DetailsFragment正确显示了项目Y(以纵向选择)但 TitlesFragment 仍将 item X 显示为已选择(即在第一次屏幕旋转之前选择的那个)。

当然,我希望在 TitlesFragment 中也正确显示在纵向方向上所做的最后选择,否则我最终会出现不一致的突出显示,在显示详细信息时显示项目 X 已被选中项目 Y.

我发布了更改 ListView 模式(在“onActivityCreated”中)和设置所选项目(在“showDetails”方法中)的相关代码:

public static class TitlesFragment extends ListFragment {
boolean mDualPane;
int mCurCheckPosition = 0;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

// Populate list with our static array of titles.
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_activated_1, Shakespeare.TITLES));

// Check to see if we have a frame in which to embed the details
// fragment directly in the containing UI.
View detailsFrame = getActivity().findViewById(R.id.details);
mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;

if (savedInstanceState != null) {
// Restore last state for checked position.
mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
}

if (mDualPane) {
// In dual-pane mode, the list view highlights the selected item.
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// Make sure our UI is in the correct state.
showDetails(mCurCheckPosition);
}
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
showDetails(position);
}

/**
* Helper function to show the details of a selected item, either by
* displaying a fragment in-place in the current UI, or starting a
* whole new activity in which it is displayed.
*/
void showDetails(int index) {
mCurCheckPosition = index;

if (mDualPane) {
// We can display everything in-place with fragments, so update
// the list to highlight the selected item and show the data.
getListView().setItemChecked(index, true);

// Check what fragment is currently shown, replace if needed.
DetailsFragment details = (DetailsFragment)
getFragmentManager().findFragmentById(R.id.details);
if (details == null || details.getShownIndex() != index) {
// Make new fragment to show this selection.
details = DetailsFragment.newInstance(index);

// Execute a transaction, replacing any existing fragment
// with this one inside the frame.
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}

} else {
// Otherwise we need to launch a new activity to display
// the dialog fragment with selected text.
Intent intent = new Intent();
intent.setClass(getActivity(), DetailsActivity.class);
intent.putExtra("index", index);
startActivity(intent);
}
}

有没有人知道如何解决此类问题?提前致谢。

最佳答案

两年后,我在这里使用来自 Android 的 v4 支持库的 fragment 布局示例,但我遇到了这个完全相同的问题!

这是我想出的唯一不需要一直使用 CHOICE_MODE_SINGLE 的修复方法:

只需在 TitlesFragment 的 onResume() 方法中添加对 getListView().setItemChecked(mCurCheckPosition, true); 的调用。而且...就是这样!

关于android - 在屏幕旋转时切换 ListView ChoiceMode 时的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7189219/

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