Android 片段实例化器在 onCreateView 之前不运行



我要做的是使用参数实例化新片段,以设置我的MainActivity类中onCreateView中使用的值。

fragment类

//package
//imports
public class LansFragment extends Fragment {
    private static final String ARG_TEXT = "arg_text";
    public LansFragment() {
        super();
    }
    public static LansFragment newInstance(String lan) {
        LansFragment fragment = new LansFragment();
        Bundle args = new Bundle();
        args.putString(ARG_TEXT, lan);
        fragment.setArguments(args);
        return fragment;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_lans, container, false);
        Bundle args = getArguments();
        if (args != null) {
            String lan = args.getString(ARG_TEXT);
            //do things using params
        } else {
            //blank params 
            //should have been set when instantiated from MainActivity?
        }
        return view;
    }
}

MainActivity class

//package
//imports
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
         String data = "Some string";
         LansFragment testfragment = LansFragment.newInstance(data);
    }

问题

目前有两个问题。第一个问题是如果我删除: LansFragment testfragment = LansFragment.newInstance(data);然后这个片段仍然运行,这是由于activity_main.xml中声明的片段吗?

其次,更重要的问题 - 当我实例化类并传递参数时,就像我在示例中所做的那样,它们在 onViewCreate中永远不会可用,而是总是以 null出现,是什么导致了这种情况?

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="app.stats.MainActivity"
    android:orientation="horizontal">
    <fragment xmlns:android=
        "http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/lans_fragment"
        android:name="app.stats.LansFragment"
        tools:layout="@layout/fragment_lans"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

xml中添加片段时,它是使用默认构造函数创建的。

LansFragment testfragment = LansFragment.newInstance(data);创建了一个新片段,但没有添加到您的布局中,也不会影响XML中定义的片段。

如果要创建一个带有其他参数的片段,则必须使用FragmentManager添加它,例如:

getFragmentManager().beginTransaction()
      .replace(R.layout.fragment_layout, testfragment).commit();

其中R.layout.fragment_layout是XML(通常是Framelayout)中的容器布局,在您的情况下,只需替换<fragment ...

 <FrameLayout
        android:id="@+id/fragment_layout "
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

请注意,如果您的片段扩展了android.support.v4.app.Fragment,则应将getFragmentManager()替换为getSupportFragmentManager()

最新更新