Saya mencoba memodifikasi kode contoh HoneyCombGallery untuk mengubah tampilan yang ditampilkan ketika tab diubah. Pada contoh yang diberikan Google, fragmen yang ditampilkan selalu sama saat Anda berpindah tab. Hanya data yang ditampilkan yang berubah. Namun, yang ingin saya lakukan adalah mengubah fragmen dan kelas yang ditampilkan saat tab diubah.
Berikut kode yang telah saya modifikasi pada contoh HoneyCombGallery: (MainActivity.java)
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
int nTabSelected = tab.getPosition();
switch (nTabSelected) {
case 0:
setContentView(R.layout.settings_fragment);
break;
case 1:
setContentView(R.layout.main);
break;
}
segala sesuatu yang lain hampir sama. (perhatikan juga bahwa, seperti sebelumnya, MainActivity.onCreate memanggil setContentView(R.layout.main) - Saya belum pernah mendengar bahwa memanggil setContentView beberapa kali tidak diperbolehkan. Saya tetap bermaksud melakukannya di setiap klik tab)
Dan berikut adalah tata letak yang digelembungkan dalam kode (settings_fragment.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frags2">
<fragment class="com.example.android.hcgallery.SettingsFragment"
android:id="@+id/settings_fragment2"
android:visibility="gone"
android:layout_marginTop="?android:attr/actionBarSize"
android:layout_width="@dimen/titles_size"
android:layout_height="match_parent" />
</LinearLayout>
"Fragmen pengaturan" adalah kelas saya yang memperluas Fragmen: (SettingsFragment.java)
public class SettingsFragment extends Fragment {
private View v;
@Override
public View onCreateView(final LayoutInflater inflater,
final ViewGroup container, final Bundle savedInstanceState) {
if (v != null)
return v;
v = inflater.inflate(R.layout.settings_layout, container, false);
return v;
}
}
Xmlnya juga sangat mudah (settings_layout.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/settings_layout" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingTop="10dip">
<TextView android:text="1.0.0" android:id="@+id/tv_version2"
android:layout_marginTop="?android:attr/actionBarSize"
android:textSize="15dp" android:textStyle="bold" android:typeface="sans"
android:layout_height="wrap_content" android:layout_width="200dp"
android:paddingTop="10dip" android:gravity="right" >
</TextView>
</RelativeLayout>
Ini tampak mudah dan ketika aplikasi dimulai, settings_fragment terlihat karena tab ke-0 dipilih secara default. Saat kita memilih tab berikutnya, saya berharap setContentView(R.layout.main) dijalankan dan saya akan melihat tata letak utama (ini sama seperti pada contoh Google: tidak ada modifikasi). Namun, yang saya dapatkan adalah pengecualian ini:
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): FATAL EXCEPTION: main
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): android.view.InflateException: Binary XML file line #23: Error inflating class fragment
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:224)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.app.Activity.setContentView(Activity.java:1777)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at com.example.android.hcgallery.MainActivity.onTabSelected(MainActivity.java:109)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:462)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java:787)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at com.android.internal.widget.ActionBarView$TabClickListener.onClick(ActionBarView.java:950)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.view.View.performClick(View.java:3100)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.view.View$PerformClick.run(View.java:11644)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.os.Handler.handleCallback(Handler.java:587)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.os.Handler.dispatchMessage(Handler.java:92)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.os.Looper.loop(Looper.java:126)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.app.ActivityThread.main(ActivityThread.java:3997)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at java.lang.reflect.Method.invokeNative(Native Method)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at java.lang.reflect.Method.invoke(Method.java:491)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at dalvik.system.NativeStart.main(Native Method)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): Caused by: java.lang.IllegalArgumentException: Binary XML file line #23: Duplicate id 0x7f09000a, tag null, or parent id 0x7f090009 with another fragment for com.example.android.hcgallery.TitlesFragment
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.app.Activity.onCreateView(Activity.java:4095)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
12-15 16:49:28.501: ERROR/AndroidRuntime(31485): ... 21 more
Kesalahannya tampaknya adalah "Android.view.InflateException: Baris file XML biner #23: Kesalahan menggembungkan fragmen kelas"
Apa artinya ini? Bisakah saya melakukan setContentView untuk mengubah fragmen dan tata letak sesuai keinginan ketika tab berbeda dipilih? Jika ini bukan cara yang tepat untuk memiliki tata letak berbeda untuk tab berbeda, apa cara yang tepat untuk melakukannya?
Saya telah mengunggah seluruh kode sumber zip ke HoneycombGallery_Modified.zip - https://docs.google.com/open?id=0B0FHtQOpOYx6YWFiMDcxYmEtOGFkMy00NWU2LTk2MzMtZWY0YzdmZWUzMDU0 (Klik "File->Unduh asli" jika Anda ingin mengunduh seluruh file zip)