你好我正在尝试编写一个程序,当设备处于纵向模式时可以显示一个片段,而另一个程序处于横向模式时。我遇到了一些使代码无法工作的问题:
我使用了getWidth()和getHeight()来获取纵向和横向模式,但是这些函数在4.3中被弃用了我可以使用的其他函数来做这个吗?
我使用了replace()函数来显示我想要的片段,但它已被删除为错误
完整的代码如下。您会发现我已经指出了错误使用箭头和注释的位置,因此您可以确切地知道问题在我的代码中的位置。请查看我的代码并帮我解决。
公共类MainActivity扩展了ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//---get the current display info---
WindowManager wm = getWindowManager();
Display d = wm.getDefaultDisplay();
if (d.getWidth() > d.getHeight())//<----------these two functions get struck out as //an error
{
//---landscape mode---
Fragment1 fragment1 = new Fragment1();
// android.R.id.content refers to the content
// view of the activity
fragmentTransaction.replace( //<------this replace() function is seen as an //error
android.R.id.content, fragment1);
}
else
{
//---portrait mode---
Fragment2 fragment2 = new Fragment2();
fragmentTransaction.replace(//<------this replace() function is also seen as an //error
android.R.id.content, fragment2);
}
fragmentTransaction.commit();
**/
}
答案 0 :(得分:2)
尝试在onCreate中使用这样的模式。它更干净,而且它使用正确的getSupportFragmentManager()而不是继承的,有限的getFragmentManager()
:
int currentOrientation = getResources().getConfiguration().orientation;
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE)
{
Fragment1 placeholder = new Fragment1();
placeholder.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, placeholder).commit();
} else
{
Fragment2 placeholder = new Fragment2();
placeholder.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, placeholder).commit();
}
答案 1 :(得分:0)
您可以通过覆盖活动中的onConfigurationChanged()
方法来检查实际屏幕方向。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//load landscape fragment
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
//load portrait fragment
}
}
同样可以onCreate()
。您可以使用
Configuration config = getResources().getConfiguration();
还要查看here,因为您可能需要稍微编辑清单文件。对于处理方向更改的活动,您需要设置:
<activity android:name=".MyActivity"
android:configChanges="orientation"
... >
答案 2 :(得分:0)
创建两个Activity
布局,但为它们指定完全相同的名称(例如activity_main.xml)。
将一个放在res / layout-port目录中......
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/container-port"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
将另一个放在res / layout-land目录中......
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/container-land"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
请注意FrameLayouts
有不同的资源ID(@+id/container-port
和@+id/container-land
)。
在MainActivity
中,只需使用以下代码......
public class MainActivity extends ActionBarActivity {
FrameLayout container;
boolean isPortrait = true
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
container = (FrameLayout) findViewById(R.id.container-port);
if (container == null) {
isPortrait = false;
container = (FrameLayout) findViewById(R.id.container-land);
}
...
}
}
Android会根据设备的方向自动对相关布局进行充气。无需获得宽度/高度甚至无需直接检查方向。这是通过尝试使用findViewById(...)
并根据容器是否为null
相应地设置布尔值来隐式完成的。从那时起,您可以使用isPortrait
布尔值来指示代码的工作方式。
此外,如果你正在使用支持库,N8sBug使用getSupportFragmentManager()
是正确的。