【问题标题】:Android annotations: Different layout for portrait and landscapeAndroid注释:纵向和横向的不同布局
【发布时间】:2015-11-21 15:29:18
【问题描述】:

我正在使用 AA,并且想为纵向和横向指定两个不同的 xml 布局文件。

在我的 java 类中,标记为 EActivity 提供了一个用 @Click 注释的方法来响应点击事件。

在纵向模式下一切正常。但是当手机旋转时,布局发生变化,按钮不再响应。

我的猜测是@EActivity注解后提供的布局是纵向布局。

如何同时提供纵向和横向布局?

提前致谢。

更新 我使用两个不同的布局文件来“监听”方向变化,一个用于纵向,名为 layout/contact.xml,另一个用于横向,名为 layout-land/contact.xml。 Android 会完成剩下的工作并根据手机方向使用正确的布局。

要为点击事件注册监听器,我使用 Android Annotations:

contact.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:background="#000000"
    android:layout_height="match_parent">

    <include
        layout="@layout/header_layout" />

    <!-- Some elements -->
</LinearLayout>

header_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:background="#000000"
    android:layout_height="60dp">

    <ImageButton
        android:id="@+id/menuHome"
        android:layout_width="25dp"
        android:src="@drawable/menu"
        android:paddingTop="22dp"
        android:paddingBottom="22dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_gravity="center"
        android:background="#00000000"
        android:scaleType="fitCenter"
        android:layout_height="match_parent" />
    <!-- Other buttons -->
</LinearLayout>

contact.java

@EActivity(R.layout.activity_contact)
public class ContactActivity extends TopLevelActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public String getPageTitle() {
        return "Nous contacter";
    }
}

** TopLevelActivity.java **

@EActivity
public abstract class TopLevelActivity extends Activity implements ITopLevelActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Click
    public void menuHome () {
        startActivity(new Intent(this, HomeActivity_.class));
    }
}

【问题讨论】:

  • 您如何收听方向变化以及何时注册视图以进行点击收听?添加此代码以便我们提供更好的帮助。

标签: java android android-annotations


【解决方案1】:

在您的 java 文件中添加以下代码

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        setContentView(R.layout.activity_main_h);
        button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(this);
    }
    else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        setContentView(R.layout.activity_main_v);
        button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(this);
    }
}

另外,将以下内容添加到清单中的活动中: android:configChanges="keyboardHidden|orientation|screenSize"

【讨论】:

  • 我已经更新了我的问题,当然也尝试了你的建议。感谢您的回答,我在contact.java中添加了您的一段代码,但没有调用该方法(我放了一个断点,它从未被触发)。
  • 您必须将android:configChanges="keyboardHidden|orientation|screenSize" 添加到清单上的活动中,如果不这样做,则不会调用此方法,请参阅developer.android.com/reference/android/app/…
  • 感谢您的评论,它解决了我的问题。把它放在一个答案中,这样我就可以接受它;-)
  • 接受@sasikumar 答案,因为它有答案的主要部分,我编辑了答案以包括缺少的清单部分,它应该在审核过程完成后出现:)
【解决方案2】:

为了为纵向或横向创建不同的布局配置,保留单个资源文件名,系统会自动选择,您可以使用配置限定符。

用于确定应使用哪个资源的配置限定符。我们在Android系统中有多个限定符:"Table 2. Configuration qualifier names."

这里是示例屏幕截图,用于说明您如何选择所需的配置限定符。

1) 首先,输入资源名称并从“可用限定符”列表中选择一个限定符;

2) 按[>>]按钮将选中的限定符移动到“已选择的限定符”列表中; 3) 现在您选择了限定符,并且可以为每个单独的限定符指定值。

注意:每个文件不能只选择一种类型的限定符。例如。一种尺寸限定符、一种密度限定符等。

app/src/main/res 下的“项目视图”选项卡中,您可以看到下一个结构:

1) 在“Android 视图”模式下:

2) 在“项目文件”模式下

非常重要

如果您的资源文件依赖于配置限定符,您应该在layoutdrawablevalues 等默认文件夹下提供默认版本的资源文件。如果不满足配置限定符,则意味着运行您的应用程序的设备不符合使用给定资源的条件,并且您的应用程序没有默认资源文件,您的应用程序将崩溃

android.content.res.Resources$NotFoundException: Resource ID #0x7f0b001c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多