0

我有一个在 XML 中定义的 2 窗格视图。对于 xlarge,视图的左侧是处理内容选择的 Fragment。我想初始化此选择器ListFragment以在应用启动时突出显示第一项。

我已经写了一个方法ListFragment来做到这一点:

public void setSelectedItem (int position) {
    //Unselect the previous item
    if(mPreviousPosition != ListView.INVALID_POSITION) {
        View oldSelected = getListView().getChildAt(mPreviousPosition);
        oldSelected.setBackgroundResource(R.drawable.menu_button);
        ((ImageView) oldSelected.findViewById(R.id.selector_icon)).setImageDrawable(icons.getDrawable(mPreviousPosition));
        ((TextView) oldSelected.findViewById(R.id.selector_text)).setTextAppearance(getActivity(), R.style.text_selector);
    }

    //Select this item
    View newSelected = getListView().getChildAt(position);
    newSelected.setBackgroundResource(R.drawable.menu_button_active);
    ((ImageView) newSelected.findViewById(R.id.selector_icon)).setImageDrawable(icons_active.getDrawable(position));
    ((TextView) newSelected.findViewById(R.id.selector_text)).setTextAppearance(getActivity(), R.style.text_selector_active);

    mPreviousPosition = position;
}

当我在选择一个项目后调用它时,它工作得很好。但是当我尝试在启动时突出显示第一项时,我在

newSelected.setBackgroundResource(R.drawable.menu_button_active);

它似乎getListView().getChildAt(position)正在返回null,因为尚未创建 Fragment 的视图。

那么,从我的 Activity 中的哪个位置尝试初始化ListFragment? 我已经尝试过 onStart、onRestoreInstanceState 和 onResume,但它们都会产生 NPE。

4

2 回答 2

0

您没有在填充 ListView 的片段回调中指定。无论如何,这是比较活动状态和片段状态的图表,也许可以帮助您:

活动状态与片段状态相比

于 2012-08-01T14:01:38.093 回答
0

据我了解,您有两个窗格(左窗格是 ListFragment),这两个片段保存在 FragmentActivity 中。片段在 FragmentActivity 的 xml 布局中设置。在 onAttach() 循环之后,FragmentActivity 可以使用 Fragment,但这并不一定意味着子 Fragment 中的视图元素仍然可用。

第一个问题是您要在哪里设置所选项目?在 FragmentActivity 中还是在 ListFragment 中?它应该在 onResume() 方法的 ListFragment 中处理。

我认为,根据 ListFragment 中的选择,您将使用选择的数据填充正确的片段。您可能希望查看此链接,该链接将为您提供使用侦听器来避免片段活动和底层片段之间的依赖关系的一个很好的示例

http://developer.android.com/training/basics/fragments/communicating.html

然后,您可以使用侦听器处理 ListFragment 中的选择并将选择传递给正确的片段。在正确的片段中,您可以检查 FragmentActivity 中的选择以及注册片段以侦听选择。这样,您应该涵盖在正确的片段注册为侦听器之前触发选择的情况。

UDPATE

查看响应式布局设计以获取更多信息,但这里有一些起点。

/res
    /values
       bool.xml
    /values-sw600dp-land
       bools.xml

然后在 bools.xml 文件中为 isDualPane 定义一个值

<resources>
    <bool name="isDualPane">[true/false]</bool>
</resources>

然后在 listFragment 中的代码中,您可以引用 bools 资源并知道布局是什么。

isDualPane = getResources().getBoolean(R.bool.isDualPane);

您还可以在任何类中使用它来了解布局是什么,而无需在类之间创建依赖关系。

以下是一些可能有帮助的链接。

http://developer.android.com/training/multiscreen/screensizes.html http://developer.android.com/training/multiscreen/adaptui.h​​tml

于 2012-08-09T14:39:38.540 回答