问题是这里的问题
我有一个Fragment
班DisplayFragment
我已经在content frame
中有一个节目,然后我做了
DisplayFragment a = DisplayFragment.newInstance();
getSupportFragmentManager().beginTransaction()
.replace(R.id.contentFrame, DisplayFragment)
.commit();
然后我想使用view
获取fragment
View v = a.getView();
,但它会返回null view
。
谁能告诉我为什么?因为我必须更改新Fragment
的某些视图设置。
onCreateView()
中的 DisplayFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_display, container, false);
//Some TextView setup
Button button = (Button) view.fineViewById(R.id.button);
return view; }
答案 0 :(得分:1)
您需要使用延迟或将View v = a.getView();
置于循环中,这将首先观察您的片段是否已成功附加,创建并添加到您的活动中。为此,如果两者都返回true,则可以使用此isAdded()
和isInLayout()
进行检查,然后只调用getView()
现在为什么这样,当你使用will with fragment添加/替换片段时,class将首先执行它将是启动片段生命周期,即onAttach(),onCreate(),onCreateView()等等。现在,您将从getView()获取null,因为您的视图仍未创建。 Fragment Life Cycle。如果您对此有疑问,请告诉我。
答案 1 :(得分:0)
声明DisplayFragment a;作为类参考。因为在提交之后你只想访问View v = a.getView();由于片段生命周期而无法使用。您可以在执行代码块之后获得。
确保您必须在类DisplayFragment
上提及OnCreateView()方法 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
// We have different layouts, and in one of them this
// fragment's containing frame doesn't exist. The fragment
// may still be created from its saved state, but there is
// no reason to try to create its view hierarchy because it
// won't be displayed. Note this is not needed -- we could
// just run the code below, where we would create and return
// the view hierarchy; it would just never be used.
return null;
}
Log.i("Right", "onCreateView()");
return inflater.inflate(R.layout.right, container, false);
}
答案 2 :(得分:0)
我假设您在View v = a.getView();
之后立即致电commit
?
因为getView
方法仅在onCreateView
返回后返回非空值。
在您的情况下,在调用commit()
之后,需要时间来完成DisplayFragment a
的所有生命周期回调(来自onCreate - > onCreatedView,..)。
因此,在commit()
之后,getView
方法仍会返回null
。
答案 3 :(得分:0)
我有和你一样的问题。
由于碎片交易没有立即发生。这就是为什么有时findViewById()
无法正常工作的原因。但是我们可以使用executePendingTransactions()
方法来执行挂起的事务。我在项目中使用了以下代码来执行pedingTransactions。
Fragment f = (Fragment)(FragmentClass.class).newInstance();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.your_fragment_container_name,f).commit();
fm.executePendingTransactions(); //Notice the FragmentManager Class object