如何/何时初始化通过XML添加的片段?

时间:2012-07-31 12:19:18

标签: android android-fragments

我有一个用XML定义的2窗格视图。对于xlarge,视图的左侧是处理内容选择的片段。我想初始化此选择器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;
}

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

处获得NPE
newSelected.setBackgroundResource(R.drawable.menu_button_active);

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

那么,从我的Activity中可以安全地尝试初始化ListFragment?我已经尝试过onStart,onRestoreInstanceState和onResume,但它们都产生了NPE。

2 个答案:

答案 0 :(得分:0)

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

activity state compared to fragment state

答案 1 :(得分:0)

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

第一个问题是你在哪里设置所选项目?在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