2017-08-15 70 views
0

我有一个xmllayout-normal,layout-largelayout-land。我想要做的是在特定的orientation中使用提供的xml如何在旋转时更改布局?

我已经在这里搜索它,这是我已经尝试过。

1)我在里面用不同的layout名称,但同样ids并覆盖onConfigurationChanged并设置layout那里。这里是我的代码

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
     setContentView(R.layout.activity_login2); 
    } 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
     setContentView(R.layout.activity_login); 
    } 
} 

它不会改变,但是当屏幕旋转的EditText在输入的数据已经一去不复返了。我试图用onSaveInstanceState来保存instance,但仍然是一样的。它看起来像破坏了活动并创建一个新的,在onCreate中初始化的所有小部件都消失了。

2)然后我发现layout-land,只是把景观布局也有相同的布局名称,比如在layout-normallayout-large例子是

res/layout-land -> activity_login.xml

res/layout-normal-> activity_login.xml

res/layout-large-> activity_login.xml

,并删除代码上的onConfigurationChanged但仍不起作用。

在我AndroidManifestLoginActivity我把

 <activity 
     android:name=".LoginActivity" 
     android:configChanges="keyboardHidden|orientation|screenSize" 
     android:theme="@style/DefaultTheme" 
     android:windowSoftInputMode="adjustResize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

反正是有改变布局时屏幕旋转?先谢谢你。

回答

2

“屏幕尺寸”限定符的优先级高于“方向”限定符。 https://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources

Android支持多种配置限定符,您可以通过用短划线分隔每个限定符来将多个限定符添加到一个目录名称。表2列出了有效的配置限定符,按优先顺序

假设你有这些文件:

res/ 
    layout-normal/ 
     layout.xml 
    layout-land/ 
     layout.xml 

如果你有一个正常的屏幕尺寸设备,也不会不管你是否使用人像或景观。 layout-normal将始终选择layout-land

你可以解决这两种不同的方式。

首先,您可以将您的“默认”布局放置在普通的layout目录中(而不是layout-normal)。所以,你的文件将是

res/ 
    layout/ 
     layout.xml 
    layout-land/ 
     layout.xml 

其次,你可以为了使其明显,你纵向和横向之间区分结合预选赛。所以你的文件将是

res/ 
    layout-normal/ 
     layout.xml 
    layout-normal-land/ 
     layout.xml 
+0

我试过这个,但它仍然使用肖像布局 – natsumiyu

+0

我认为即使Android文档也没有使这些细节如此明显。就我个人而言,我从来没有面对OP的问题,因为我的景观文件被放置在默认位置+1。 –

+0

当我尝试它时,它只使用正确的布局,当我旋转应用程序刚刚开始时,应用程序首次开始使用将被使用,直到我关闭该应用程序。当我关闭应用程序并以横向位置再次打开时,它会发生变化。 – natsumiyu

1

我想你可能会错过layout-land文件夹。应该是这样的,无论你在那里指定的布局如some_activity.xml,都会在设备旋转到横向时自动使用。您可以将布局文件命名为您的potrait版本已经使用的相同的确切名称。布局文件本身也可以使用相同的ID来命名出现的各种小部件。

对于设备旋转时丢失一些UI状态,您可能必须覆盖onSaveInstanceState(Bundle savedInstanceState)并在轮换发生时保存UI中的某些状态。这与实际显示的布局文件没有任何关系。

+0

我已经试过了。但它仍然使用肖像布局。 – natsumiyu

+0

你使用了完全相同的名字吗?你的风景布局XML是否与肖像不同? –

+0

问题在于'normal'限定符的优先级高于'land'限定符。看到我的答案更详细。 –

0

首先您不需要创建另一个.xml就像activity_login2,您可以使用相同的activity_login.xml

Android有默认文件夹/res/layout其中包括所有的布局。所以,无论何时您旋转设备,它都会使用相同的activity_login.xml文件。

您可以添加新文件夹/ res/layout-land,将activity_login.xml复制到其中并进行必要的调整。

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
     setContentView(R.layout.activity_login2); // it will use .xml from /res/layout 
    } 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
     setContentView(R.layout.activity_login); // it will use xml from /res/layout-land 
    } 
} 
+0

是否有'layout'文件夹可以在哪里设置更大屏幕的横向布局? – natsumiyu

+0

我应该在'res/layout-normal'和'res/layout-large'中删除'xml'吗? – natsumiyu

+0

@mori:你可以尝试两种。拿一个适合你的。 –