2013-11-26 51 views
0

這是我第一次運行Fragments。看看下面的代碼。無法加載活動的片段

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" /> 

    <fragment 
     android:id="@+id/firstViewFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     class="com.example.fragmenttest.FirstView"/> 

    <fragment 
     android:id="@+id/secondViewFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     class="com.example.fragmenttest.SecondView"/> 

</RelativeLayout> 

fragment_view1.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/viewOneText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="92dp" 
     android:layout_marginTop="182dp" 
     android:text="First View" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <Button 
     android:id="@+id/viewOneBtn" 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignRight="@+id/textView1" 
     android:layout_below="@+id/textView1" 
     android:layout_marginTop="16dp" 
     android:text="Click Here" /> 

</RelativeLayout> 

fragment_view2.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#ffddff" > 

    <TextView 
     android:id="@+id/secondViewText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="190dp" 
     android:text="View 2" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <Button 
     android:id="@+id/secondViewBtn" 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/secondViewText" 
     android:layout_centerHorizontal="true" 
     android:text="Button" /> 

</RelativeLayout> 

MainActivity.java

package com.example.fragmenttest; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

FirstView.java

package com.example.fragmenttest; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.TextView; 

public class FirstView extends Fragment 
{ 
    private TextView firstText; 
    private Button btn; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     firstText = (TextView)getView().findViewById(R.id.viewOneText); 
     btn = (Button)getView().findViewById(R.id.viewOneBtn); 

     btn.setOnClickListener(new ButtonEvent()); 

     View view = inflater.inflate(R.layout.fragment_view1,container,false); 
     return view; 

    } 

    private class ButtonEvent implements OnClickListener 
    { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      firstText.setText("First View Btn Clicked"); 

     } 

    } 
} 

SecondView.java

package com.example.fragmenttest; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.TextView; 

public class SecondView extends Fragment 
{ 
    private TextView secondText; 
    private Button secondViewBtn; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     secondText = (TextView)getView().findViewById(R.id.secondViewText); 
     secondViewBtn = (Button)getView().findViewById(R.id.secondViewBtn); 

     secondViewBtn.setOnClickListener(new ButtonEvent()); 

     View view = inflater.inflate(R.layout.fragment_view2,container,false); 
     return view; 

    } 

    private class ButtonEvent implements OnClickListener 
    { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      secondText.setText("Second View Text changed"); 

     } 

    } 
} 

當我運行該應用程序,我得到以下錯誤

11-26 12:18:36.137: E/AndroidRuntime(850): FATAL EXCEPTION: main 
11-26 12:18:36.137: E/AndroidRuntime(850): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmenttest/com.example.fragmenttest.MainActivity}: android.view.InflateException: Binary XML file line #16: Error inflating class fragment 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.os.Looper.loop(Looper.java:137) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.ActivityThread.main(ActivityThread.java:5041) 
11-26 12:18:36.137: E/AndroidRuntime(850): at java.lang.reflect.Method.invokeNative(Native Method) 
11-26 12:18:36.137: E/AndroidRuntime(850): at java.lang.reflect.Method.invoke(Method.java:511) 
11-26 12:18:36.137: E/AndroidRuntime(850): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
11-26 12:18:36.137: E/AndroidRuntime(850): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
11-26 12:18:36.137: E/AndroidRuntime(850): at dalvik.system.NativeStart.main(Native Method) 
11-26 12:18:36.137: E/AndroidRuntime(850): Caused by: android.view.InflateException: Binary XML file line #16: Error inflating class fragment 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
11-26 12:18:36.137: E/AndroidRuntime(850): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.Activity.setContentView(Activity.java:1881) 
11-26 12:18:36.137: E/AndroidRuntime(850): at com.example.fragmenttest.MainActivity.onCreate(MainActivity.java:12) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.Activity.performCreate(Activity.java:5104) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
11-26 12:18:36.137: E/AndroidRuntime(850): ... 11 more 
11-26 12:18:36.137: E/AndroidRuntime(850): Caused by: java.lang.ClassCastException: com.example.fragmenttest.FirstView cannot be cast to android.app.Fragment 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.Fragment.instantiate(Fragment.java:585) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.Fragment.instantiate(Fragment.java:560) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.app.Activity.onCreateView(Activity.java:4709) 
11-26 12:18:36.137: E/AndroidRuntime(850): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680) 
11-26 12:18:36.137: E/AndroidRuntime(850): ... 21 more 

爲什麼我無法運行?

UPDATE

如SO網友提到,我改變了我的MainActivity

package com.example.fragmenttest; 

import android.os.Bundle; 
import android.app.Activity; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

現在我有以下錯誤

11-26 12:35:34.137: E/AndroidRuntime(968): FATAL EXCEPTION: main 
11-26 12:35:34.137: E/AndroidRuntime(968): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmenttest/com.example.fragmenttest.MainActivity}: android.view.InflateException: Binary XML file line #16: Error inflating class fragment 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.os.Looper.loop(Looper.java:137) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.ActivityThread.main(ActivityThread.java:5041) 
11-26 12:35:34.137: E/AndroidRuntime(968): at java.lang.reflect.Method.invokeNative(Native Method) 
11-26 12:35:34.137: E/AndroidRuntime(968): at java.lang.reflect.Method.invoke(Method.java:511) 
11-26 12:35:34.137: E/AndroidRuntime(968): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
11-26 12:35:34.137: E/AndroidRuntime(968): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
11-26 12:35:34.137: E/AndroidRuntime(968): at dalvik.system.NativeStart.main(Native Method) 
11-26 12:35:34.137: E/AndroidRuntime(968): Caused by: android.view.InflateException: Binary XML file line #16: Error inflating class fragment 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
11-26 12:35:34.137: E/AndroidRuntime(968): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.Activity.setContentView(Activity.java:1881) 
11-26 12:35:34.137: E/AndroidRuntime(968): at com.example.fragmenttest.MainActivity.onCreate(MainActivity.java:13) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.Activity.performCreate(Activity.java:5104) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
11-26 12:35:34.137: E/AndroidRuntime(968): ... 11 more 
11-26 12:35:34.137: E/AndroidRuntime(968): Caused by: java.lang.NullPointerException 
11-26 12:35:34.137: E/AndroidRuntime(968): at com.example.fragmenttest.FirstView.onCreateView(FirstView.java:19) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:900) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1184) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:285) 
11-26 12:35:34.137: E/AndroidRuntime(968): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 
11-26 12:35:34.137: E/AndroidRuntime(968): ... 21 more 

回答

1

MainActivity必須從支持庫擴展FragmentActivity ..

而在你的第一個片段的onCreateView(),這是第一線

View view = inflater.inflate(R.layout.fragment_view1,container,false); 

view

+0

您好,我提交了更新。我仍然有錯誤。請看一看。 –

+0

@Artificial_Intelligence更新檢查一次.. –

+0

是的,謝謝.... –

2

至少,MainActivity應該擴展FragmentActivity

後,在您的片段:

此代碼:

firstText = (TextView)getView().findViewById(R.id.viewOneText); 
btn = (Button)getView().findViewById(R.id.viewOneBtn); 

btn.setOnClickListener(new ButtonEvent()); 

應該去你吹什麼後:

View view = inflater.inflate(R.layout.fragment_view1,container,false); 

請回片段文檔,以瞭解他們更深。現在看起來你對如何使用片段沒有多少清晰的認識。你的問題將持續到你知道更好的碎片。祝你好運,歡迎回來,如果你有任何問題。

+0

你好,我提交了一個更新。我仍然有錯誤。請看一看。 –

+0

仔細閱讀您的日誌:它清楚地表明您在第19行的FirstView類中有NullPointerException。 –

1

您正在使用Android SDK 11中的Fragment組合並支持Fragments。

有2個解決方案:

  • 作爲@Vladimir伊萬諾夫建議,你可以使用一個FragmentActivity(這是支持的活動,以支持一些碎片)
  • 你可以使用一個android.app.Fragment (這是Android SDK 11+片段,與SDK 11+的支持andorid.app.Activity一致)

這實際上有點令人困惑,因爲有些類共享相同的名稱。但是您必須決定是使用Android SDK 11+還是支持庫來支持SDK 7+以上的設備。你不能混合這些類。

+0

您好,我提交了更新。我仍然有錯誤。請看一看。 –

+0

現在的錯誤不同了,您忘記在FirstFragment的第一行OnCreateView中膨脹xml – Snicolas

0

更換getView()問題很簡單。你應該創建FragmentManager和FragmentTransaction是constance管理器片段

+1

不,這隻適用於動態片段,不適用於通過XML膨脹的片段。 – Snicolas

1

您試圖將SupportMapFragmen轉換爲本機API Level 11 android.app.Fragment。這是行不通的。或者:

將您的android:minSdkVersion設置爲11或更高。