我在我的應用程序中有兩個片段,Fragment1
和Fragment2
。兩者都使用稱爲content_view1
和content_view2
的不同佈局。我把這兩個片段放入ViewPager
。現在看到代碼:
MainActivity.java
爲什麼我不能在ViewPager中的不同佈局中使用相同的ID爲
public class MainActivity extends FragmentActivity {
public ViewPager vp;
FragmentAdapter fragmentAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vp = new ViewPager(this);
vp.setId("VP".hashCode());
fragmentAdapter = new FragmentAdapter(
getSupportFragmentManager());
vp.setAdapter(fragmentAdapter);
setContentView(vp);
vp.setCurrentItem(0);
}
}
Fragment1.java
public class Fragment1 extends Fragment {
MainActivity mainActivity;
public Fragment1() {
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mainActivity=(MainActivity)getActivity();
return inflater.inflate(R.layout.content_view1, null);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((TextView)mainActivity.findViewById(R.id.haiTextView)).setText("Hello");
}
}
Fragment2.java
public class Fragment2 extends Fragment {
MainActivity mainActivity;
public Fragment2() {
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mainActivity=(MainActivity)getActivity();
return inflater.inflate(R.layout.content_view2, null);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((TextView)mainActivity.findViewById(R.id.haiTextView)).setText("Hai");
}
}
FragmentAdapter.java
public class FragmentAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> mFragments;
public FragmentAdapter(FragmentManager fm) {
super(fm);
mFragments = new ArrayList<Fragment>();
mFragments.add(new Fragment1());
mFragments.add(new Fragment2());
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
}
content_view1.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal" >
<TextView
android:id="@+id/haiTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true" />
</FrameLayout>
content_view2.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal" >
<TextView
android:id="@+id/haiTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true" />
</FrameLayout>
現在你看都佈局有一個TextView的與同一id
。
當我運行這個應用程序時,fragment1的TextView
有文本「hai」,而fragment2的TextView
有文本「」。但我期望的是,片段1的TextView
應該有文本「你好」,而片段2的TextView
應該有文本「海」。
好吧,我現在將TextView
的編號content_view2.xml
更改爲haiTextView2
。 Fragment2.java
也一樣。現在應用程序按照我的預期完美工作。
現在我的問題:
1)爲什麼我我以前不得到預期的放出來的時候我都保持了TextView
ID一樣嗎?
2)爲什麼我不能在這裏使用相同的ID?
爲什麼我應該避免'setRetainInstance()' – 2013-04-28 14:34:55
非常感謝。 'getView()'對我來說是非常有用的信息。 – 2013-04-28 14:38:54
@VishalVijay'setRetaininstance(true)'將在配置更改中保留該片段,另一方面'ViewPager'在輪換更改後自行處理片段。在任何情況下,該方法都不能與碎片一起使用。 – Luksprog 2013-04-28 14:43:46