ฉันกำลังพยายามแก้ไขโค้ดตัวอย่าง HoneyCombGallery เพื่อเปลี่ยนมุมมองที่แสดงเมื่อเปลี่ยนแท็บ ในตัวอย่างที่จัดทำโดย Google แฟรกเมนต์ที่แสดงจะเหมือนกันเสมอเมื่อคุณสลับแท็บ เฉพาะข้อมูลที่แสดงการเปลี่ยนแปลง อย่างไรก็ตาม สิ่งที่ฉันต้องการทำคือเปลี่ยนแฟรกเมนต์และคลาสที่แสดงเมื่อเปลี่ยนแท็บ
นี่คือโค้ดที่ฉันแก้ไขในตัวอย่าง 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;
}
อย่างอื่นก็ค่อนข้างเหมือนกันหมด (โปรดทราบว่าเช่นก่อนหน้านี้ MainActivity.onCreate เรียก setContentView(R.layout.main) - ฉันไม่ได้ยินมาว่าไม่อนุญาตให้เรียก setContentView หลายครั้ง ฉันตั้งใจที่จะทำเช่นนั้นในแต่ละแท็บคลิกต่อไป)
และนี่คือเลย์เอาต์ที่ถูกขยายในโค้ด (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>
"ส่วนการตั้งค่า" คือคลาสของฉันที่ขยาย Fragment: (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;
}
}
xml นั้นตรงไปตรงมาเช่นกัน (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>
ดูเหมือนตรงไปตรงมาและเมื่อแอปเริ่มต้น settings_fragment จะปรากฏให้เห็นเมื่อเลือกแท็บที่ 0 ตามค่าเริ่มต้น เมื่อเราเลือกแท็บถัดไป ฉันคาดหวังว่า setContentView(R.layout.main) จะถูกดำเนินการและฉันจะเห็นเลย์เอาต์หลัก (นี่เหมือนกับในตัวอย่างของ Google: ไม่มีการแก้ไข) อย่างไรก็ตาม สิ่งที่ฉันได้รับคือข้อยกเว้นนี้:
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
ดูเหมือนว่าข้อผิดพลาดจะเป็น "android.view.InflateException: บรรทัดไฟล์ XML ไบนารี #23: เกิดข้อผิดพลาดในการขยายส่วนของคลาส"
สิ่งนี้หมายความว่า? ฉันไม่สามารถ setContentView เพื่อเปลี่ยนแฟรกเมนต์และเลย์เอาต์ตามที่ฉันต้องการเมื่อเลือกแท็บอื่นได้หรือไม่ หากนี่ไม่ใช่วิธีที่ถูกต้องในการจัดเลย์เอาต์ที่แตกต่างกันสำหรับแท็บต่างๆ จะต้องทำอย่างไร?
ฉันมีซอร์สโค้ดทั้งหมดที่อัปโหลดไปยัง HoneycombGallery_Modified.zip - https://docs.google.com/open?id=0B0FHtQOpOYx6YWFiMDcxYmEtOGFkMy00NWU2LTk2MzMtZWY0YzdmZWUzMDU0 (คลิกที่ "ไฟล์->ดาวน์โหลดต้นฉบับ" หากคุณต้องการดาวน์โหลดไฟล์ zip ทั้งหมด)