2013-11-26 52 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或更高。