因此,如我的logcat中所列,在我的应用程序启动之前,我一直不断获取这些Configuration值/更改:
01-10 01:49:30.130 519-519/system_process I/ActivityManager: Config changes=1df8 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1920dp h1080dp 160dpi xlrg long land ?uimode ?night -touch -keyb/v/h -nav/h s.2}
01-10 01:49:30.150 519-519/system_process I/ActivityManager: Config changes=400 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1920dp h1055dp 160dpi xlrg long land ?uimode ?night -touch -keyb/v/h -nav/h s.3}
01-10 01:49:31.860 519-519/system_process I/ActivityManager: Config changes=200 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1920dp h1055dp 160dpi xlrg long land -touch -keyb/v/h -nav/h s.4}
01-10 01:49:40.130 519-558/system_process I/ActivityManager: Config changes=8 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1920dp h1055dp 160dpi xlrg long land finger -keyb/v/h -nav/h s.5}
01-10 01:50:04.120 519-532/system_process I/ActivityManager: Config changes=480 {1.0 ?mcc?mnc en_US ldltr sw1080dp w1080dp h1895dp 160dpi xlrg long port finger -keyb/v/h -nav/h s.6}
我知道基于Android开发者页面here的configChanges=
值是什么意思,但是,我想问一下从初始显示高度值1080dp到接下来的3个1055dp的高度变化配置更改,然后是1895dp的最后一个列表。基本上,它会检测到USB触摸屏,并尝试重新绘制应用程序窗口的WxH。
问题是,在我的应用程序setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
或setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT)
中,甚至在我的AndroidManifest.xml中,所有标记都正确放置在其中:
android:configChanges="mnc|keyboard|keyboardHidden|navigation|orientation|screenSize|screenLayout|touchscreen"
android:screenOrientation="portrait"
但是由于某种原因我的layout.xml从1080x1920(最初是1920x1080,但我的应用更改了方向)重新初始化为1080x1895!我的layout.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
android:layout_gravity="center"
android:keepScreenOn="true"
tools:context=".MyActivity" >
<RelativeLayout
android:id="@+id/childLayout"
android:layout_width="fill_parent"
android:layout_height="1550dp"
android:background="@color/black">
<VideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="228dp"
android:src="@raw/my_video" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/backgroundFrame"
android:layout_width="fill_parent"
android:layout_height="600dp"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:background="@color/black">
<ToggleButton
android:id="@+id/bOrientation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="@color/blue"
android:textOff="Not Flipped"
android:textOn="Flipped"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_gravity="top|center_horizontal">
<ImageView
android:id="@+id/imageView1"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_marginBottom="20dp"
android:background="@color/trans"
android:src="@drawable/my_image" />
</FrameLayout>
</RelativeLayout>
</RelativeLayout>
所以,我不知道为什么,当我的应用启动时,即使名为backgroundFrame的relativeLayout的imageView完美地以纵向定向,在VideoView中播放的视频也会像在屏幕边界之外被拉伸它处于横向模式。它试图填充1895dp的高度值,而其他backgroundFrame布局则不然!我仔细研究了这个1895dp值的来源,也许可以覆盖它,我尝试使用onSavedInstanceState()
和OnConfigurationChanged()
来做到这一点,但是每当我检测到新的方向变化并尝试手动重置时这样做可以将其追溯到1920年:
newConfig.screenHeightDp = 1920;
Log.d("CONFIG CHANGE2","HeightDP: " + newConfig.screenHeightDp);
heightPixels = newConfig.screenHeightDp;
this.getResources().getDisplayMetrics().heightPixels = 1920;
this.getResources().getConfiguration().screenHeightDp = 1920;
this.getResources().updateConfiguration(context.getResources().getConfiguration(), context.getResources().getDisplayMetrics());
但是,对于onSavedInstance和onConfigurationChanged,更改不会在启动时持久保存。当我执行dumpsys时,这是我在窗口管理器显示内容中找到的内容:
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1920x1080 160dpi cur=1080x1920 app=1080x1920 rng=1080x1055-1920x1895
layoutNeeded=false
该范围表示显示可以从1055-1895开始,即从source开始,该值表示问题中列出的最小标称应用高度和最大标称应用高度。我有办法改变应用程序中的那些DisplayInfo
值吗?