【问题标题】:Maintaining highlight for selected item in fragment?保持片段中选定项目的突出显示?
【发布时间】:2023-03-31 18:08:02
【问题描述】:

我有一个包含两个片段的布局。左侧片段是使用 SimpleCursorAdaptor 的 ListFragment,右侧填充了从左侧片段列表中选择的项目的详细信息。我试图弄清楚如何确保 ListFragment 中选定的项目保持突出显示,直到选择列表中的另一个项目。

经过一些研究,我尝试使用 android:background="@drawable/item_selector" 我可以更改不同状态的颜色,但它们似乎都没有持续存在。我认为 selected 会......在您选择其他项目之前,您选择的项目仍然是所选项目,这似乎是合乎逻辑的。

我什至尝试在我的点击处理程序中使用v.setSelected(true);,希望它可以保持状态,但这也不起作用。

有没有我想念的状态?我浏览了开发文档,但似乎没有其他合适的...

item_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_pressed="true" 
        android:drawable="@color/green" />
    <item 
        android:state_selected="true" 
        android:drawable="@color/blue" />
</selector>

我不确定其他代码可能会有所帮助,因此请随时询问您认为必要的其他任何内容。

【问题讨论】:

  • 我知道这是旧的,但选择器是否不需要一个没有限定符的元素以防无法匹配?

标签: android android-layout android-widget


【解决方案1】:

经过进一步研究,答案在 android 文档中(实际上是文档的两部分)。

首先,在触摸模式下,没有选中或聚焦状态。

其次,默认情况下,列表视图设置为无选择模式(意味着列表中的任何项目都不能具有选择状态)。我所要做的就是通过添加以下内容来更改选择模式(可以是单个或多个,我只需要/想要单个):

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

然后我在选择器 XML 中使用了选择状态(转换为 activated 状态):

<item 
 android:state_activated="true" 
 android:drawable="@color/blue" />

在行布局xml文件中应用它作为背景:

   <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="35dp"
    android:background="@drawable/item_selector"
    android:gravity="center_vertical"/>

我选择的项目现在以蓝色背景显示,直到选择了不同的项目。

请注意,这 (android:state_activated) 需要 Android API 11 或更高版本。

【讨论】:

  • android:state_activated 至少需要 API 级别 11
  • 我试过了,我的 API > 11 但它似乎不起作用。我也在使用 ListFragment,鉴于主/详细视图是如此基本的东西,让它工作起来非常困难。您是否可能忘记了解决方案中的一个小细节?因为只是你发布的部分,似乎不足以让它对我有用。
  • @Zainodis,我已经更新了我的答案。我真的认为这很明显,但也许不是。您必须将样式应用于 XML 中的行布局。
  • @Barak 感谢您的更新 :) - 通过查看其他示例找到了答案。也许它实际上很明显,我忽略了它,但感谢澄清:)!
【解决方案2】:

我认为您也需要添加 state_focused 以使其感觉像是被选中或突出显示的。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_pressed="true" 
        android:drawable="@color/green" />
    <item 
        android:state_selected="true" 
        android:drawable="@color/blue" />

    <item 
        android:state_focused="true" 
        android:drawable="@color/red" />
</selector>

【讨论】:

  • 感谢您的建议。我试了一下,但仍然没有运气。 :(
【解决方案3】:

这在ListFragment 中对我来说非常有用,但我认为它仅适用于 Android 4.0 及更高版本。我使用android:background="?android:attr/activatedBackgroundIndicator 为列表项创建了一个简单的布局(如果Android 低于4.0,您需要在drawables 中找到类似的布局):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:background="?android:attr/activatedBackgroundIndicator"
android:orientation="horizontal" >

<TextView
    android:id="@+id/list_item_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:singleLine="true"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:layout_margin="@dimen/double_view_margin" />

然后,只需使用此布局创建一个简单的ArrayAdapter 并将选择模式设置为单一:

final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels);

setListAdapter(labelsAdapter);

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

之后,您可以使用setItemChecked 方法突出显示必要的项目:

@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id) {
    getListView().setItemChecked(position, true);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2019-07-07
    • 2013-04-07
    • 1970-01-01
    相关资源
    最近更新 更多