如何在android中运行时添加片段

时间:2015-01-10 14:07:21

标签: android android-fragments

你好我正在尝试编写一个程序,当设备处于纵向模式时可以显示一个片段,而另一个程序处于横向模式时。我遇到了一些使代码无法工作的问题:

我使用了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();
**/

}

3 个答案:

答案 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()是正确的。