然而另一个findViewById()的案例在片段中返回null

时间:2014-08-05 11:57:35

标签: java android android-fragments

是的,我知道有几个关于 findViewById()的问题返回null 而且没有,似乎没有一个能解决我的问题。

大多数解决方案都是关于调用findViewId()的时间,我认为这不是我的情况。

所以,我有一个MyFragment类,用于ViewPager上显示的片段。该类遵循建议的模式(使用newInstance()方法)。

在我的onCreateView方法中,我在新增的视图(Views)中找到了一些rootView,设置了一些属性(字体,文本...)和侦听器。根据条件,Views中的一个(在此示例中,problematicLayout)应该是可见/隐藏的。

在旋转设备之前一切正常。正如我所做的那样,onCreateView()中的所有视图都已正确找到并且其属性已设置。但是,problematicLayout = (LinearLayout ) rootView.findViewById(R.id.problematicLayout)正在返回null。如果我暂停并浏览View层次结构  (rootView - > mChildren - >等等)我可以看到problematicLayoutID = -1!

我也尝试使用方法签名的视图将findViewById(R.id.problematicLayout)移动到onViewCreated(),只是为了达到相同的效果。

如果我评论该行并且永远不会使problematicLayout不可见/消失,我就没有相同的问题。

为什么会这样?为什么将此problematicLayout's ID设置为-1,导致findViewById()返回null?我在这里缺少什么?

public static Fragment newInstance(Context context,
    int position, Answer answer) {

    MyFragment frag = new MyFragment ();

    Bundle args = new Bundle();
    args.putParcelable(STUFF NAME, STUFF);
    frag.setArguments(args);

    return frag;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(
            R.layout.my_fragment, container, false);

    ScorllView someScrollView = (ScrollView) rootView.findViewById(R.id.someScrollView);
    // ... other views, setting their event listners, etc.

    LinearLayout problematicLayout = (LinearLayout ) rootView.findViewById(R.id.problematicLayout);

    setProblematicLayout(problematicLayout);

    // ... setting other listeners, etc.
    return rootView;

}

public void setProblematicLayout(LinearLayout layout)
{
     if(!condition)
     {
         layout.setVisibiliy(View.GONE)
         // ... set listeners and properties for views inside the layout.
     }
     else
     {
         layout.setVisibiliy(View.INVISIBLE);
     }

}

1 个答案:

答案 0 :(得分:0)

如果您正在使用纵向/横向的布局资源变体,请确保在两者中都找到该视图。