【问题标题】:Different widgets (views) for different screen orientations?不同屏幕方向的不同小部件(视图)?
【发布时间】:2013-07-15 18:41:42
【问题描述】:

我是 Android 开发新手,所以我有一个非常基本的问题。

基本上,我有两种屏幕布局,一种用于纵向,另一种用于横向。我使用文件夹 res/layout 和 res/layout-land。两个方向都画得很好,但是我为每个方向都有不同的小部件(按钮),btnPortrait 和 btnLandscape。

当我尝试调用 onSetClickListener() 时出现问题。因为当设备纵向放置时,框架无法定位 btnLandscape,反之亦然,我使用 onConfigurationChange() 手动处理方向更改。它似乎也不起作用。

我的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnPortrait = (Button) findViewById(R.id.portraitButton);
    tvPortrait = (TextView) findViewById(R.id.portraitText);
    btnLandscape = (Button) findViewById(R.id.landscapeButton);
    tvLandscape = (TextView) findViewById(R.id.landscapeText);
}

还有onConfigurationChange():

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

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        btnPortrait.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                    Toast.makeText(getContext(), "Portrait",Toast.LENGTH_SHORT).show();
            }
        });
    }

    else {
        btnLandscape.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), "Landscape", Toast.LENGTH_SHORT).show();
            }
        });
    }   
}

Toasts 都不起作用。 有人知道会发生什么吗?

提前致谢。

【问题讨论】:

  • 为什么每个按钮都有不同的按钮?只需给它们相同的 ID,Activity 就会相应地查找它们
  • 它们不是针对同一个功能的,换句话说,它们是两个完全不同的按钮。我用 Toast 简化了代码以不进入业务模型,这与我的问题无关。

标签: android android-widget screen-orientation


【解决方案1】:

不要以不同的方式命名它们;无论是纵向还是横向,相同功能的小部件都应共享相同的 ID。

如果它是一个仅在横向中存在或功能不同的小部件,只需在 findViewById() 之后检查它是否为 null,如果返回 null,您就知道您的配置中没有包含该按钮的布局。

【讨论】:

  • 你是对的,无论我在哪里尝试初始化按钮,它都会返回 null 。您是否想出一种分配横向布局但不在纵向布局中的小部件的方法?谢谢。
  • 如我所说,尝试解析按钮。如果它不为空,那么您就知道您处于横向布局中。
【解决方案2】:

只需确保您在布局中的按钮 ID 与默认布局中的 ID 相同

更新1:

在使用这样的小部件之前添加非空检查

if( btnPortrait !=null ) { 
// do what you want 
}

【讨论】:

  • 正如我在评论中所说,它们不是同一个按钮。一个应该以纵向模式显示,另一个以横向模式显示。
【解决方案3】:

我不确定你在 cmets 中的意思是“它们不是同一个按钮”,但是用两个不同的资源 id 做你想做的事情的方法如下......

public class MyActivity extends Activity {

    Button myButton = null;
    TextView myTextView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myButton = (Button) findViewById(R.id.portraitButton);
        if (myButton == null)
            myButton = (Button) findViewById(R.id.landscapeButton);
        myTextView = (TextView) findViewById(R.id.portraitText);
        if (myTextView == null)
            myTextView = (TextView) findViewById(R.id.landscapeText);
    }

    // The following method is your OnClickListener
    public void sayHello(View v) {
        switch (v.getId) {
            case R.id.portraitButton :
                // Do something for portrait
                break;
            case R.id.landscapeButton :
                // Do something for landscape
                break;
        }
    }
}

在您的布局文件中,您将使用android:onClick 分配OnClickListener,如下所示...

对于肖像...

<Button
    android:id="@+id/portraitButton"
    ...
    android:onClick="sayHello" >
</Button>

横向...

<Button
    android:id="@+id/landscapeButton"
    ...
    android:onClick="sayHello" >
</Button>

这样,OnClickListener 在调用setContentView(...) 时由膨胀过程设置。然后它简单地归结为它确定资源 ID 以决定需要采取什么行动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    相关资源
    最近更新 更多