【问题标题】:illegalstateexception did not create a view when screen orientation changes屏幕方向更改时,非法状态异常未创建视图
【发布时间】:2015-06-15 05:32:31
【问题描述】:

我一直在尝试制作一个从活动 (GradeListActivity) 打开列表视图片段 (GradeListFragment) 的应用程序。当我单击一个项目时,它会打开一个新片段 (GradeDetailFragment)。如果在纵向模式下,它将替换 fragment1 中的列表片段。如果在横向,它将替换空片段2。我的问题是当我切换方向时应用程序崩溃。从两个角度切换会得到相同的错误。

04-09 12:10:52.240: E/AndroidRuntime(2221): FATAL EXCEPTION: main
04-09 12:10:52.240: E/AndroidRuntime(2221): Process:     bcs421.christophergoepfert.hwk.gradeapp.presentation, PID: 2221
04-09 12:10:52.240: E/AndroidRuntime(2221): java.lang.RuntimeException:   Unable to start activity    ComponentInfo{bcs421.christophergoepfert.hwk.gradeapp.presentation/bcs421.christ     ophergoepfert.hwk.gradeapp.presentation.GradeListActivity}:   android.view.InflateException: Binary XML file line #8: Error inflating class   fragment
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3912)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.ActivityThread.access$900(ActivityThread.java:144)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at    android.os.Handler.dispatchMessage(Handler.java:102)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.os.Looper.loop(Looper.java:135)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.ActivityThread.main(ActivityThread.java:5221)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at java.lang.reflect.Method.invoke(Native Method)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at java.lang.reflect.Method.invoke(Method.java:372)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at     com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
04-09 12:10:52.240: E/AndroidRuntime(2221): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:377)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.Activity.setContentView(Activity.java:2144)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at bcs421.christophergoepfert.hwk.gradeapp.presentation.GradeListActivity.onCreate(GradeListActivity.java:29)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.Activity.performCreate(Activity.java:5933)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
04-09 12:10:52.240: E/AndroidRuntime(2221):     ... 11 more
04-09 12:10:52.240: E/AndroidRuntime(2221): Caused by: java.lang.IllegalStateException: Fragment android.app.ListFragment did not create a view.
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2145)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.app.Activity.onCreateView(Activity.java:5282)
04-09 12:10:52.240: E/AndroidRuntime(2221):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)

MainActivity 重新启动时不会崩溃。

public class MainActivity extends Activity{

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

        //grade data 
    }

}
public void startGradeListActivity(View v){

    Intent i = new Intent(MainActivity.this, GradeListActivity.class);
    //putextra gradecollection
    startActivity(i);

    }
}

main_activity xml

<TextView
    android:id="@+id/textViewName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/name" />

<RatingBar
    android:id="@+id/ratingBar1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:numStars="4"
    android:stepSize="1" />

<TextView
    android:id="@+id/textViewGradeNumber"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/gradeNumber" />

<TextView
    android:id="@+id/textViewGradeLetter"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<Button
    android:id="@+id/buttonViewGrades"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="startGradeListActivity"
    android:text="@string/viewGrades" />

GradeListActivity 在 ft.commit(); 崩溃,也许问题是我正在导入 android.support.v4.app.FragmentActivity;?

public class GradeListActivity extends FragmentActivity {
//private GradeCollection listGrades;
//private ArrayList<String> listCatagory;
//private ArrayAdapter<String> listAdapter;

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

    ListFragment fragment = new GradeListFragment();
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment1, fragment);

    ft.commit();

    }
}

这是 GradeListFragment。

public class GradeListFragment extends ListFragment{

 @Override
 public View onCreateView(  LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        View v = inflater.inflate(R.layout.fragment_category, container, false);
       //data handling
        return v;
     }
 }

这是 catagory_list 肖像的 xml

<fragment
    android:id="@+id/fragment1"
    android:name="android.app.ListFragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1.03" />

这里是风景

<fragment
    android:id="@+id/fragment1"
    android:name="android.app.ListFragment"
    android:layout_width="271dp"
    android:layout_height="match_parent" />

<FrameLayout
    android:id="@+id/fragment2"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

我省略了传递的实际数据以及 GradeDetailFragment,因为我知道这些不是问题。我看过this 页面,但我不太了解它是如何工作的,所以我无法对其进行测试。我已经在清单中尝试过 onConfigChange,但是我无法更改为适当的布局。如果有人可以解决此问题或解释链接,我将不胜感激。

【问题讨论】:

    标签: android android-fragments android-listfragment illegalstateexception


    【解决方案1】:

    看这个文档:

    注意:当您通过在布局 XML 文件中定义片段来将片段添加到活动布局时,您无法在运行时删除该片段。如果您计划在用户交互期间交换片段,则必须在 Activity 首次启动时将片段添加到 Activity。

    所以你不能在运行时替换R.id.fragment1,比如:

    ft.replace(R.id.fragment1, fragment); //wrong
    

    那么在运行时实现片段更改的正确方法,您可以使用片段容器FrameLayoutFragment 替换为您的R.id.fragment1 为:

    <FrameLayout
       android:id="@+id/fragment1"       
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1.03" />
    

    然后您可以在R.id.fragment1 中添加/替换片段。

    希望对您有所帮助!

    【讨论】:

    • 它确实有效!太感谢了。我知道片段在添加/删除时播放效果不佳,这就是为什么片段 2 是 FrameLayout 但我认为既然片段 1 仍然存在,那不会有问题。它也摆脱了我的永久加载循环问题(你知道为什么会这样吗?)。如果我有声望,我会投票赞成。
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2012-06-07
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多