相关疑难解决方法(0)

如何在Android中声明全局变量?

我正在创建一个需要登录的应用程序.我创建了主要和登录活动.

在主要活动onCreate方法中,我添加了以下条件:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    loadSettings();
    if(strSessionString == null)
    {
        login();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

onActivityResult登录表单终止时执行的方法如下所示:

@Override
public void onActivityResult(int requestCode,
                             int resultCode,
                             Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {
        case(SHOW_SUBACTICITY_LOGIN):
        {
            if(resultCode == Activity.RESULT_OK)
            {

                strSessionString = data.getStringExtra(Login.SESSIONSTRING);
                connectionAvailable = true;
                strUsername = data.getStringExtra(Login.USERNAME);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是登录表单有时会出现两次(login()方法被调用两次),当手机键盘滑动时,再次出现登录表单,我猜问题是变量strSessionString.

有没有人知道如何设置变量global以避免在用户已经成功验证后出现登录表单?

singleton android state global-variables

592
推荐指数
7
解决办法
30万
查看次数

处理和缓解IllegalStateException("故障保存状态:活动$ Fragment已清除索引:-1")

我的Android应用程序管理多个片段.我看到该字段中有大量崩溃,但是包含此日志行:

java.lang.IllegalStateException:失败保存状态:active XxxFragment {81e598 id = 0x7f0b0069 tag_yyy}已清除索引:-1

在Stack Overflow中搜索答案毫无结果; 我似乎有很多公司想知道这个例外究竟意味着什么.深入研究异常跟踪和Android源代码,我可以看到异常来自我的主Activity保存其状态(FragmentActivity.onSaveInstanceState),并且各个Fragments正被写入Parcelable.每个Fragment都有一个索引(称为mIndex),它必须是非负的,但是从代码中可以清楚地知道为什么必须是这种情况,因为mIndex永远不会在该函数中再次使用.

我不知道Fragment如何进入这种状态,或者我能做些什么.我无法在自己的测试环境中重现错误.任何人都可以阐明如何避免和/或处理此异常?

相关的SO问题:

java.lang.IllegalStateException:失败保存状态:active已清除片段中的索引

活动片段清除了什么索引:-1表示我该如何解决?

获取异常作为失败保存状态:当我按下Android设备的主页按钮时,活动片段已清除索引:-1

Android片段的IllegalStateException

java android android-fragments

16
推荐指数
1
解决办法
6402
查看次数

如何在单/双窗格布局中管理UI状态和后端堆栈

我无法解决如何Fragment在典型的列表细节设计模式中正确管理s的问题.

我的布局工作正常,横向视图(双窗格)的结构如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ... >
    <FrameLayout android:id="@+id/list" ... />
    <FrameLayout android:id="@+id/container" ... />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

像这样的纵向视图(单个窗格):

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container" ... />
Run Code Online (Sandbox Code Playgroud)

我还有一个refs.xmlin res/values-w600dp/,以确保根据设备的屏幕宽度加载适当的布局.

选择列表项时,横向视图应并排显示列表和详细信息,而纵向视图应仅显示全屏详细信息.如果未选择任何内容,则横向视图应显示左侧的左侧和右侧的空白区域,而纵向视图应仅显示全屏列表.

例

但是,这是我遇到麻烦的地方:

  • 我是否使用"main" Activity作为列表+可选的详细信息布局,另一个"详细信息" Activity用于纵向,仅详细信息布局?这似乎是Fragments指南示例所做的.我已经得到了这个普遍的工作,但是当方向改变时,我如何保持我的细节片段的状态?

    考虑上面显示的相反情况 - 从纵向旋转到横向,同时细节可见意味着Activity需要finish()编辑细节,因此主要Activity可以显示双窗格布局,但这也会破坏细节片段及其细节savedInstanceState.如果用户EditText在详细信息片段的字段中键入了信息,然后旋转设备,当我将其添加到主(双窗格)时,如何保留详细信息片段的整个UI状态Activity

  • 我是否只使用一个ActivityFragment自己管理?这允许我在方向改变时保留细节UI的状态(因为Android会自动处理这个问题),但是当它涉及到后端堆栈时会变得混乱.

    考虑图像中的情况 - 当细节可见时应从横向旋转到纵向应显示单窗格显示详细信息,但如何正确管理后堆栈和ActionBar主页图标以显示列表单窗格?旋转回到横向还需要撤消我之前执行的任何后向堆栈操作,因为两个片段将立即可见.

经过一些搜索后,我发现了两个类似的问题(从双窗格切换到单窗格上的方向更改维护片段堆栈保留活动之间的片段状态),但我的情况略有不同,因为我不是要尝试改进此功能但是最好预先计划好.我错过了什么?当然,Android可以同时管理后台堆栈(如多个Activity案例) UI状态(如单个Activity案例中),对吧?

android android-lifecycle android-fragments android-orientation

13
推荐指数
1
解决办法
3751
查看次数