标签: android-configchanges

配置后从backstack更改片段现在共享FrameLayout?

应用问题:

当方向更改时,应用程序遇到以下问题:

  • FragmentA和FragmentC现在都占用了FrameLayout容器.

什么有效:在旋转屏幕之前,一切都按照我想要的方式工作.

活动描述简要说明:

EditActivity目的:编辑集合和项目字段.

以编程方式创建此活动的片段:

  • FragmentA - 用于编辑集合字段的片段
  • FragmentB - 集合中项目的ListFragment
  • FragmentC - 用于编辑项目字段的片段.

初始布局:FragmentA位于FragmentB的顶部,每个都位于自己的FrameLayouts中.

当用户单击FragmentB的listview项时:将FragmentA替换为FragmentC以允许用户编辑该项的字段.现在FragmentC位于FragmentB之上.

这似乎是一个非常简单的概念:活动的顶部用于编辑整个集合的属性或集合中的单个项目.我觉得我没有对布局做过任何奇妙的事情,所以我有点困惑的是,电话(模拟器)的简单旋转会导致这些问题,我正在尝试修复这样一个卑鄙的时间.

为什么Android Fragment Guide示例对我不起作用:他们的示例与我正在做的非常相似,但是他们的详细信息片段要么在新活动中打开,要么在当前活动中的自己的Frame中打开,他们不做任何事情交换片段所以我无法收集他们如何使用onSaveIstanceState来保存可见的片段,然后在onCreate中使用该信息来重新创建在方向更改之前存在的UI.

编辑:通过放弃并将listfragment放入XML中解决了一个问题,这解决了永久旋转"加载..."问题.

android android-configchanges android-fragments back-stack android-framelayout

8
推荐指数
1
解决办法
7028
查看次数

"错误:不允许字符串类型(在'configChanges'中,值为'keyboard | keyboardHidden | orien"...在AndroidManifest.xml中

最重要的是,我是Android的新手,我使用的是API 10(Gingerbread).

我正在用libgdx开发一个简单的游戏.但我只是安装一切开始工作,并在... AndroidManifest.xml这一行:

android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
Run Code Online (Sandbox Code Playgroud)

在控制台中出现下一个错误:_

error: Error: String types not allowed (at 'configChanges' with value 'keyboard|keyboardHidden|orientation|screenSize').
Run Code Online (Sandbox Code Playgroud)

我已经发现了#1 这个答案,我改为13 API和作品...但我觉得应该有一个更好的解决方案比不使应用程序兼容少,因为一行代码(有很多人仍然使用姜饼).还有另一种解决方法吗?

api android android-manifest android-configchanges

8
推荐指数
2
解决办法
1万
查看次数

对于片段A,findFragmentByTag为null,如果片段B上为setRetain(true)

我的问题涉及托管三个支持片段的活动.一个是正​​常的程序片段(让我们称之为家庭片段).一个是在设备定向时添加在主片段顶部的肖像片段,一个是"无头"的,以便无论配置如何变化都能继续执行异步任务.很简单,我正在研究这个很好的例子.

public class HeadlessCustomerDetailFetchFragment extends Fragment{
private RequestCustomerDetails mRequest;
private AsyncFetchCustomerDetails mAsyncFetchCustomerDetails;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    mRequest = (RequestCustomerDetails)getActivity();
}

public void startFetching(String scannedBarcode) {
    if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.RUNNING) return;

    if(mAsyncFetchCustomerDetails == null || mAsyncFetchCustomerDetails.getStatus() == AsyncTask.Status.FINISHED)
        mAsyncFetchCustomerDetails = new AsyncFetchCustomerDetails(getActivity(), mRequest, mPartner, scannedBarcode);
}

public void stopFetching() {
    if(mAsyncFetchCustomerDetails != null && mAsyncFetchCustomerDetails.getStatus() != AsyncTask.Status.RUNNING) return;
    mAsyncFetchCustomerDetails.cancel(true);
}
Run Code Online (Sandbox Code Playgroud)

}

在我的活动的onCreate()中,我根据需要创建并添加无头片段.

 mHeadlessCustomerDetailFetchFragment = (HeadlessCustomerDetailFetchFragment)getSupportFragmentManager()
            .findFragmentByTag(HeadlessCustomerDetailFetchFragment.class.getSimpleName());

if(mHeadlessCustomerDetailFetchFragment == null) {
         mHeadlessCustomerDetailFetchFragment = …
Run Code Online (Sandbox Code Playgroud)

android android-configchanges android-fragments fragmentmanager

8
推荐指数
1
解决办法
507
查看次数

是否有画中画 (pip) 模式布局的布局配置限定符

我已经为我的应用程序实现了 pip。

我注意到在画中画支持文档中建议

android:configChanges=
    "screenSize|smallestScreenSize|screenLayout|orientation"
Run Code Online (Sandbox Code Playgroud)

被添加到清单中。这会在应用程序进入 pip 模式时阻止 Activity 生命周期触发。我希望重新创建活动 - 因此重新创建布局。

很简单,我只是不使用那条线。

所以现在我的活动被创建并且布局膨胀。现在只有 Android 正在膨胀<layout>-small.xml。现在这是一个比膨胀“正常”布局更好的选择,但对于 pip 模式来说,它的布局仍然太大。(小屏幕 - 如文档中所述,至少 426dp x 320dp - pip 比这小得多。

所以我的问题是 - 是否有一个尚未记录的 pip 大小布局的布局配置限定符,或者我是否必须调整我的小布局以确保所有内容都位于中间以便可以看到(不是一个非常令人满意的解决方案) .


编辑

这里一个限定-pip ,即<layout>-pip.xml,这是我发现的事故,那编译没有错误“无效的资源目录名称”。美好时光。

但是-small当进入 pip 模式时,Android 仍然会夸大布局。艰难时期


更新

我最终通过创建额外的简化布局来实现这一点,我在onCreate检查后加载这些布局isInPictureInPictureMode()。这不是我理想的解决方案,但在我有更好的解决方案之前,它就是这样。

android android-layout android-configchanges android-7.0-nougat android-8.0-oreo

7
推荐指数
0
解决办法
817
查看次数

Can a configuration change occur after startActivityForResult was called?

Given the following situation (partially pseudo-code):

  1. User presses a button in Activity A which in turn executes this code:
    progressBar.setVisibility(VISIBLE) // by default is set as INVISIBLE in the layout
    startActivityForResult(ActivityB)
  1. User rotates his device

Is it possible that step 2 (rotating device) causes a configuration change which leads to the recreation of Activity A and therefore the progressBar to be hidden before Activity B is shown? I know that startActivityForResult is an asynchronous call, but I am not sure …

android android-lifecycle android-configchanges android-activity

7
推荐指数
0
解决办法
66
查看次数

在Android 4.2上运行时屏幕闪烁.(活动连续重启)

一些用户报告说,在Android 4.2上运行时我的应用程序屏幕有时会闪烁(仅限!)

我尝试使用我的设备,在放入日志后,活动重新启动并重新启动,每秒约3次.

所以我所做的是在连续重启时跟踪方法调用,结果如下:

方法跟踪输出

似乎问题在于ViewGroup.resetRtlProperties(),因为这是Android 4.2(17)中的新功能.

我无法确认这是否是一个错误,但还有其他人遇到这个或有任何解决方法吗?

android right-to-left android-configchanges android-activity

6
推荐指数
1
解决办法
1530
查看次数

如何设置夜间模式可绘制对象按预期工作

随着夜间模式的变化,我要改变背景。

我有 /values 和 /values-night 文件夹,其中包含具有不同值的“colors.xml”。`

<color name="grey1">#ebebeb</color>
<color name="grey2">#c7c7c7</color>
<color name="grey3">#999999</color>
<color name="hover1">#8bb065</color>
<color name="red1">#ba0000</color>
<color name="red2">#ff0000</color>
<color name="green1">#336600</color>
<color name="text1">#000000</color>
Run Code Online (Sandbox Code Playgroud)

另一个是

<color name="grey1">#999999</color>
<color name="grey2">#333333</color>
<color name="grey3">#000000</color>
<color name="hover1">#8bb065</color>
<color name="red1">#ba0000</color>
<color name="red2">#ff0000</color>
<color name="green1">#336600</color>
<color name="text1">#ffffff</color>
Run Code Online (Sandbox Code Playgroud)

这些颜色用于背景“activity_main_bg2.xml”的图层列表:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle" >
            <solid android:color="@color/grey1" />
        </shape>
    </item>
    <item
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp">
        <shape android:shape="rectangle" >
            <solid android:color="@color/grey2" />
        </shape>
     </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

我的活动包含片段:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world_dark"
    android:background="@drawable/activity_main_bg2" />
Run Code Online (Sandbox Code Playgroud)

当我改变时间从白天到黑夜或背景中的背景颜色不会改变。但如果我使用

android:background="@color/grey1"
Run Code Online (Sandbox Code Playgroud)

一切正常。

如何解决这个问题?这是安卓bug吗?

xml android uimanager android-configchanges android-drawable

6
推荐指数
1
解决办法
5854
查看次数

当一个活动因配置更改而被破坏时,它的Loaders也会被销毁吗?

装载机开发者指南,

在配置更改后重新创建时,它们会自动重新连接到最后一个加载器的光标.因此,他们不需要重新查询他们的数据.

在这篇关于装载机的博客文章中,

当一个Activity被销毁时,Activity指示它的LoaderManager销毁并关闭它的Loaders(以及与它们相关的任何资源,比如Cursor).

问题是哪一个是正确的?当一个活动因配置更改而被销毁时,(1)其Loaders(2)与其Loaders关联的资源(例如a)会发生什么Cursor.

android android-configchanges android-activity android-loadermanager android-loader

6
推荐指数
0
解决办法
1106
查看次数

确定片段重启是否是由于屏幕旋转或Viewpager滑动造成的?

我有一个ActivityViewPager.在ViewPager有很多的网页,就像一本书.每个片段都有RecyclerViews很多内容.以下是我的用例

1 - 当我滑动页面时,RecyclerView必须从列表的开头开始.2.如果我旋转设备,它应该从旋转之前离开的位置的确切位置读取.

如果我不使用任何逻辑,第二种情况可以完美运行.即旋转.但不是第一种情况.

如果我做一些如下的逻辑.有助于实现第一种情况,但不是第二种情况.

  @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    if (savedInstanceState==null) {
        mIsFirstTime = true;
    }
}

@Override
public void onResume() {
    super.onResume();
    try {
        getActivity().invalidateOptionsMenu();
            if (!mIsFirstTime) {
                mListView.scrollToPosition(0);                
            }
    } catch (Exception e) {
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是

如何确定片段重启是由于屏幕旋转还是Viewpager滑动?

我已经试过了onConfigurationChanged(Configuration newConfig).但它对我没有帮助.请你帮助我好吗

android rotation android-configchanges android-viewpager android-recyclerview

6
推荐指数
1
解决办法
296
查看次数

轮换后Android语言会发生变化

安装我的应用程序后,首次运行时会要求用户选择语言; 但是如果用户第二次启动应用程序,则会自动设置语言(以前选择的语言).

问题是,在用户选择语言的第一次运行时,app仍然是英文的(无论用户选择什么语言),但如果我旋转设备,则语言被更改为正确的(到选定的一个).应用程序第二次运行时出现同样的问 应用程序以英语启动,但在轮换语言更改为正确之后.

有什么建议?先感谢您

这里是我更改语言的MainActivity代码:

private void initApp() {
        if (Settings.getLanguage().equals("")){ 
            String[] items = { getResources().getString(R.string.lang_eng), getResources().getString(R.string.lang_geo)};
            showDialogSingleChoise(items, getResources().getString(R.string.select_language_title), 0, false, false, this.languageSelectedListener, this.languageConfirmedListener, null);
        } else {        
            System.out.println("initApp: " + Settings.getLanguage());

            Settings.setLanguage(MainActivity.this.getResources(), Settings.getLanguage());
            appVersionCheck();
        }
    }

private OnClickListener languageConfirmedListener = new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        Settings.setLanguage(MainActivity.this.getResources(), MainActivity.this.language);
        appVersionCheck();
    }
};
Run Code Online (Sandbox Code Playgroud)

这里是来自设置的代码片段:

public static void setLanguage(Resources res, String langString){
        System.out.println("lang in pref: " + langString);
        setStringProperty(PREFS_LANG ,langString);
        MainApp.getInstance().setLocale(res);
    }
Run Code Online (Sandbox Code Playgroud)

这是我的Application类:

public class MainApp …
Run Code Online (Sandbox Code Playgroud)

android android-configchanges

5
推荐指数
1
解决办法
2754
查看次数