是的,我知道有几个关于 findViewById()的问题返回null 而且没有,似乎没有一个能解决我的问题。
大多数解决方案都是关于调用findViewId()
的时间,我认为这不是我的情况。
所以,我有一个MyFragment
类,用于ViewPager
上显示的片段。该类遵循建议的模式(使用newInstance()
方法)。
在我的onCreateView
方法中,我在新增的视图(Views
)中找到了一些rootView
,设置了一些属性(字体,文本...)和侦听器。根据条件,Views
中的一个(在此示例中,problematicLayout
)应该是可见/隐藏的。
在旋转设备之前一切正常。正如我所做的那样,onCreateView()
中的所有视图都已正确找到并且其属性已设置。但是,problematicLayout = (LinearLayout ) rootView.findViewById(R.id.problematicLayout)
正在返回null
。如果我暂停并浏览View层次结构
(rootView - > mChildren - >等等)我可以看到problematicLayout
有ID = -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);
}
}
答案 0 :(得分:0)
如果您正在使用纵向/横向的布局资源变体,请确保在两者中都找到该视图。