我已经有一段时间没遇到这个问题,而且我正在寻求帮助。我是初学者,所以如果我的术语不正确,我会道歉。我会尽可能多地回应。
我正在开发一个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;
}
}
}
发生的事情是,无论您是以横向模式还是纵向模式打开应用程序,主要的纵向布局都只显示。更改方向时,该纵向布局是唯一可见的布局。当您尝试转到流时,无论您是横向还是纵向,都会打开流布局的纵向版本。当您打开流布局并且屏幕方向发生变化时,它会返回主菜单纵向。
答案 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_PORTRAIT
和ORIENTATION_LANDSCAPE
。有关此问题的更多信息here。但是,如果你在一个静态的类中,即没有Context
,那么你必须明确地调用getResources()
之前保存的Context
实例。 1}}。例如,将其作为onCreate()
保存在mycontext = this;
方法中。这可能会导致内存泄漏,因此在example中解释了处理此问题的最佳方法(如果需要,只需)。
答案 1 :(得分:0)
您需要做的就是将两个布局分别用于纵向和一个用于横向。布局文件夹中的纵向和布局 - 土地文件夹中的横向。