1

我正在开发一个应用程序,将在工业设置中使用作为手持式界面,分布式和我的工作场所预先配置。我正在努力使应用程序作为主页启动器运行,以便让平板电脑“失踪”的诱惑力降低。主页启动器问题与碎片重新启动后

背景

我有我的表现,使应用程序启动器中的以下内容:

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.HOME" /> 
    <category android:name="android.intent.category.DEFAULT"/> 
</intent-filter> 

(我可以发布更多的清单,如果有必要的)

我的应用程序的结构如下:

  1. US B_Stuff延伸活动
  2. 主要延伸USB_Stuff
  3. 的UI扩展片段
  4. SQLiteHelper扩展SQLiteOpenHelper

“主” 处理所有的片段通信和交易的。 “Main”也是在名称属性<activity>下的清单中注册的内容。

我也有一个BOOT_COMPLETED接收器在启动我的应用程序的清单。

问题

解决现在一切都很正常,如果我从Eclipse运行程序,并使用它。但是,如果我重启设备(在华硕Nexus 7(4.2.2)和三星Galaxy Tab 2 7.0(4.1.1)上进行测试),它会在第一个屏幕上启动,其中包含ListView,如下所示:

First fragment to load

然后我可以选择的项目形成的列表,它会带我到包含在地方名单三个按钮的下一个片段:

Second fragment

解决如果我点击上面第二张图片上的红色框,那么一旦停用“onClickListener”(?),我在红色空间中触摸后,我可以选择一个不同的项目,形成ListView一次。虽然如果我点击三个可见按钮之一,应用程序将执行它的onClick方法,而不是点击进入前一个屏幕。这种行为在多个屏幕上继续,并在应用程序到达TableLayouts时停止。

另一个我觉得可能会涉及的问题是,后退按钮和后来取消按钮应该弹出后栈到某些点根本不起作用或执行不正确的弹出位置。

UPDATE:下面执行我的解决方案后,我已经解决了大部分问题,但如果我开始前2秒内使用应用程序(约),那么我还是结束了在弹出的随机后退栈位置。

我想通了那么远,

如果我注释掉主页启动intent-filter和使用BOOT_COMPLETED过滤器重新正常启动的应用程序,那么一切功能。

此外,我添加了日志语句来查看整个程序中的后退栈条目数,并在应用程序正确运行时遵循相同的确切路径,而且数字一致,但如果单击红色框,应用程序会将碎片添加到它不应该存在的后端堆栈中。这导致我相信这不是在后面堆栈上的额外项目可能泄漏他们的意见的问题。

解决编辑:我添加了一个按钮,什么都没有做,这是在宽度和高度match_parent第二个片段,当我试图通过点击前面的片段的ListView,它没有工作。看起来好像背景是“可点击的”并且前一个片段被设置为“背景/壁纸”(?)。

质询

ANSWERED 1)什么能在重新启动后会从这些片段 “布局泄漏” 到片段?

部分答案 2)什么会导致背部/取消按钮(popBackStack(...))重新启动后不能正常工作?

根据要求可提供更多代码以便于解决方案。

回答

1

问题1:因为它似乎是布局并没有被完全删除,我决定尝试删除所有的听众中的每个片段的onDestroy所有子项。我最终找到的方法removeAllViewsInLayout(),并决定尝试下面的代码:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     container.removeAllViewsInLayout(); 
     return inflater.inflate(R.layout.welcome_select_cabinet, container, false); 
    } 

此去到每一个片段,这样的布局被夸大为布局前的ViewGroup的子项将被清除。这解决了“点击”到前一个片段的项目的问题。

问题2:我已经添加了以下setContentView()在我的“主要”活动后,立即:

getFragmentManager().popBackStack(); 

,然后当我在“主”的onCreate添加第一个片段,我改变了以下:

Welcome welcomeFragment = new Welcome(); 
getFragmentManager().beginTransaction().add(R.id.parent_container, welcomeFragment, "welcomeSelect").commit(); 

这样:

WelcomeSelectCabinet welcomeSelection = new WelcomeSelectCabinet(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.add(R.id.parent_container, welcomeSelection, "welcomeSelect"); 
transaction.addToBackStack(null); 
transaction.commit(); 

现在,如果我在重新启动后等待约2秒,然后开始使用该应用程序,则不会遇到任何错误。但是,如果我立即使用该应用程序,则会出现与以前相同的错误,直到我再次重新启动并等待2秒钟。

编辑:我加入5第二负载屏幕以占〜2秒“装载”,并且似乎已经固定在的Nexus 7,但没有问题的银河标签2.我改变了5秒到10秒,因为Galaxy Tab 2似乎需要两倍左右的时间启动,这似乎解决了问题。

编辑:为了使装载更相容,我能够将其扎入BOOT_COMPLETED接收机,并设置存储在SharedPreferences一个布尔值,将确定哪些片段来加载基于该值,这是重置SHUTDOWN BroadcastReceiver。