Android 注释:纵向和横向的不同布局

Android annotations: Different layout for portrait and landscape

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

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

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

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

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

提前致谢。

更新 我 'listen' 使用两个不同的布局文件来更改方向,一个用于纵向,名为 layout/contact.xml,另一个用于横向,名为 layout-land/contact.xml. Android 完成剩下的工作并根据 phone 方向使用正确的布局。

为了注册点击事件的监听器,我使用Android注解:

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 文件中添加以下代码

@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);
    }
}

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

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

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

以下示例屏幕截图说明了您如何选择所需的配置限定符。

1) 首先,您输入资源名称和 select 来自 "Available qualifiers" 列表的限定符;

2) 按[>>]按钮将selected限定符移动到"Chosen qualifiers"列表; 3) 现在您有限定符 selected 并且可以为每个单独的限定符指定值。

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

app/src/main/res 下的 "Project View" 选项卡中,您可以看到下一个结构:

1) 在"Android view"模式下:

2) 在 "Project Files" 模式下

极其重要

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

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