替换片段后的空视图

时间:2015-08-21 07:44:25

标签: android android-fragments fragment android-view

问题是这里的问题 我有一个FragmentDisplayFragment我已经在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; }

4 个答案:

答案 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