我要做的是使用参数实例化新片段,以设置我的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()