如何根据Android中的方向更改在多个布局之间进行更改?

时间:2014-02-10 21:20:02

标签: android layout views orientation

我已经有一段时间没遇到这个问题,而且我正在寻求帮助。我是初学者,所以如果我的术语不正确,我会道歉。我会尽可能多地回应。

我正在开发一个Android应用程序,该应用程序链接到朋友的网站,在那里他可以播放各种视频。我的应用程序是非常基本的,因为我希望它以一个布局打开,当你单击一个按钮打开其中一个流时,它会打开一个不同的布局。我还希望布局根据屏幕的方向而改变。我已经在应用程序的布局文件夹中创建了4个不同的XML文件。我有主屏幕纵向布局文件,主屏幕横向布局文件,流屏幕纵向文件和流屏幕布局文件。

我的问题是,我不确定如何在4个不同的布局文件之间切换。以下代码是我的功能,我觉得我应该切换到不同的视图:

public void screenOrientation()
{
    int rotation = ((WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotation();

    LinearLayout mainPortrait = (LinearLayout) view.findViewById(R.layout.main);
    LinearLayout mainLandscape = (LinearLayout) view.findViewById(R.layout.mainlandscape);
    LinearLayout streamPortrait = (LinearLayout) view.findViewById(R.layout.streaminappportrait);
    LinearLayout streamLandscape = (LinearLayout) view.findViewById(R.layout.streaminapplandscape);

    if (Global.appShowingMain == true && Global.appShowingStream == false)
    {
        switch (rotation)
        {
            case 0:
                mainPortrait.setVisibility(View.VISIBLE);
                break;
            case 90:
                mainLandscape.setVisibility(View.VISIBLE);
                break;
            case 180:
                mainPortrait.setVisibility(View.VISIBLE);
                break;
            case 270:
                mainLandscape.setVisibility(View.VISIBLE);
                break;
            default:
                mainPortrait.setVisibility(View.VISIBLE);
                break;
        }
    }
    else if (Global.appShowingStream == true && Global.appShowingMain == false)
    {
        switch (rotation)
        {
            case 0:
                streamPortrait.setVisibility(View.VISIBLE);
                break;
            case 90:
                streamLandscape.setVisibility(View.VISIBLE);
                break;
            case 180:
                streamPortrait.setVisibility(View.VISIBLE);
                break;
            case 270:
                streamLandscape.setVisibility(View.VISIBLE);
                break;
            default:
                streamPortrait.setVisibility(View.VISIBLE);
                break;
        }
    }
}

我真的很难理解如何根据屏幕的方向在这些不同的布局之间切换。有人可以帮忙吗?

编辑:根据我在下面的对话,我已将相关代码更改为以下内容:

public void screenOrientation()     {         int rotation =((WindowManager)getApplicationContext()。getSystemService(WINDOW_SERVICE))。getDefaultDisplay()。getRotation();

    if (Global.appShowingMain == true && Global.appShowingStream == false)
    {
        switch (rotation)
        {
            case 0:
                setContentView(R.layout.main);
                break;
            case 90:
                setContentView(R.layout.mainlandscape);
                break;
            case 180:
                setContentView(R.layout.main);
                break;
            case 270:
                setContentView(R.layout.mainlandscape);
                break;
            default:
                setContentView(R.layout.main);
                break;
        }
    }
    else if (Global.appShowingStream == true && Global.appShowingMain == false)
    {
        switch (rotation)
        {
            case 0:
                setContentView(R.layout.streaminappportrait);
                break;
            case 90:
                setContentView(R.layout.streaminapplandscape);
                break;
            case 180:
                setContentView(R.layout.streaminappportrait);
                break;
            case 270:
                setContentView(R.layout.streaminapplandscape);
                break;
            default:
                setContentView(R.layout.streaminappportrait);
                break;
        }
    }
}

发生的事情是,无论您是以横向模式还是纵向模式打开应用程序,主要的纵向布局都只显示。更改方向时,该纵向布局是唯一可见的布局。当您尝试转到流时,无论您是横向还是纵向,都会打开流布局的纵向版本。当您打开流布局并且屏幕方向发生变化时,它会返回主菜单纵向。

2 个答案:

答案 0 :(得分:0)

你可以用编程方式做到这一点:

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
  // Do the changes within the portrait orientation
  ...
}
else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
  // Do the changes within the landscape orientation
  ...
}

这假设你是在Activity内进行的或衍生的。如果没有,则必须向Context方法提供getResources()个实例:

mycontext.getResources()...

----编辑----

  • getResources():这是Context课程中的一种方法。这意味着如果您在扩展另一个Context定义的类(例如Activity)的类中运行此方法,则不需要提供任何其他类。您可以在Context s here上阅读更多内容。你会知道如果你正在扩展Activity看看你的班级定义,它应该是这样的:

    public class MyActivity extends Activity { ... }
    

基本上,这个方法会返回一个包含所有资源的Resources对象。您可以在其上阅读更多内容here。但是你不需要所有的资源,所以让我们再迈出一步。

  • getConfiguration()getResources()方法返回Resources个实例。此类提供getConfiguration()方法,该方法返回Configuration实例(此here上的更多内容),其中包含许多可以使用的配置参数。其中一个是方向,因此您有两个常量,ORIENTATION_PORTRAITORIENTATION_LANDSCAPE。有关此问题的更多信息here

但是,如果你在一个静态的类中,即没有Context,那么你必须明确地调用getResources()之前保存的Context实例。 1}}。例如,将其作为onCreate()保存在mycontext = this;方法中。这可能会导致内存泄漏,因此在example中解释了处理此问题的最佳方法(如果需要,只需)。

答案 1 :(得分:0)

您需要做的就是将两个布局分别用于纵向和一个用于横向。布局文件夹中的纵向和布局 - 土地文件夹中的横向。