码迷,mamicode.com
首页 > 其他好文 > 详细

过时的PreferenceActivity导致Fragment显示问题

时间:2014-07-23 13:10:06      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:android   style   http   java   color   使用   

问题描述:

    在一个点击preferenceactivity中某项显示一个Fragment的场景中,出现错误:

java.lang.RuntimeException: This should be called after super.onCreate.

百思不得其解。因为报错的那一行是在super.onCreate之后的,代码很简单应该也不会有错误。因为当时项目代码很大,且签名成系统应用,所以不好调试。最后自己写了个简单的demo来测试,发现在启动fragment中显示找不到需要启动的fragment。找不到之后会再次回到preferenceactivity这个界面,就会导致错误。启动Fragment的代码如下:

preferenceactivity.startPreferencePanel(PowerUsageDetail.class.getName(), args, R.string.details_title, null, null, 0);

或者

startWithFragment(DemoFragment.class.getName(), null, null, 0);


问题原因:

    除了如上所示原因之外。android在level 11之后似乎就对preferenceactivity不支持了,推荐使用PreferenceFragment 

但是本项目大部分代码都是写好了,不好修改。所以还是要考虑保持原样启动要求的Fragment。所以原因是android对其不支持了。


解决方法:

    在响应点击的地方使用如下代码,显示相关的Fragment:

        FragmentManager fm = caller.getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        PowerUsageDetail pd = new PowerUsageDetail();

        Intent i = new Intent();
        i.putExtras(args);
        pd.setArguments(args);
        ft.add(android.R.id.content, pd);
        ft.addToBackStack("wodebackstack");
        ft.commit();

注意对于的ViewGroupId为android.R.id.content。在PreferenceActivity中一般是用loadFromResources来载入布局,没办法定义id。android.R.id.content表示的是视图的根id。

注意:

这样启动Fragment之后会显示透明背景,也就是说父PreferenceActivity会显示出来,显然不行。设置目的Fragment的背景即可,在layout布局中设置背景为android:background="@android:color/background_light"


总结:

1. 出现问题没有第一时间写一个简单的demo确认问题所在。

2. 对于过期的api认识不足,以为可以通过源码找到绕过问题所在。在查看源码上面花了很多时间。

3. 不知道如何获取PreferenceActivity的根view的id,导致拉长了解决问题时间。

4. 经常陷入细节中,应该从更高的层次理解代码。抽象、分层、模块化、规整化。





过时的PreferenceActivity导致Fragment显示问题,布布扣,bubuko.com

过时的PreferenceActivity导致Fragment显示问题

标签:android   style   http   java   color   使用   

原文地址:http://blog.csdn.net/murphykwu/article/details/38060191

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!