在方向更改中更改片段宽度

时间:2019-05-26 08:07:40

标签: java android android-layout android-fragments

我目前正在学习Android Studio开发,但偶然发现了一个教程的练习(坚持了将近2周)。 它要求我使用Fragment来创建这种外观:

See Image

这是我的代码:

home.java

public class home extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        Intent previousIntent = getIntent();
        String username = previousIntent.getStringExtra("username");

        Bundle sendDataToBody = new Bundle();
        sendDataToBody.putString("username", username);

        // Fragment

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        WindowManager windowManager = getWindowManager();
        Point size = new Point();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
            windowManager.getDefaultDisplay().getSize(size);

            if (size.x > size.y) {
                // landscape

                Menu fragmentMenu = new Menu();
                body fragmentBody = new body();

                fragmentBody.setArguments(sendDataToBody);

                fragmentTransaction.add(R.id.menuFrame, fragmentMenu);
                fragmentTransaction.add(R.id.bodyFrame, fragmentBody);
            } else {
                // portrait

                Menu fragmentMenu = new Menu();
                fragmentTransaction.add(R.id.menuFrame, fragmentMenu);
            }
        } else {
            Display display = windowManager.getDefaultDisplay();

            if (display.getRotation() == Surface.ROTATION_90
                    || display.getRotation() == Surface.ROTATION_270) {
                // landscape


                Menu fragmentMenu = new Menu();
                body fragmentBody = new body();

                fragmentBody.setArguments(sendDataToBody);

                fragmentTransaction.add(R.id.menuFrame, fragmentMenu);
                fragmentTransaction.add(R.id.bodyFrame, fragmentBody);
            } else {
                //portrait
                Menu fragmentMenu = new Menu();
                fragmentTransaction.add(R.id.menuFrame, fragmentMenu);
            }
        }

        fragmentTransaction.commit();
        // End of Fragment
    }
}

和我的home.xml:

   <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:paddingTop="@dimen/container_padding_vertical"
       android:paddingBottom="@dimen/container_padding_vertical"
       android:paddingRight="@dimen/container_padding_horizontal"
       android:paddingLeft="@dimen/container_padding_horizontal"
       android:orientation="vertical"
       tools:context=".home">

       <FrameLayout
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:id="@+id/menuFrame"></FrameLayout>


       <FrameLayout
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:id="@+id/bodyFrame"></FrameLayout>

   </LinearLayout>

如您所见, 如果我运行这些代码,则在纵向模式下可以用作图片。

但是当我将方向更改为横向时, 按钮仍然全屏显示。

如何将按钮更改为仅与图片类似的部分?

注意:这是我在关于Android的stackOverflow中的第一个问题。我希望我的解释足够清楚

修改

这是我的menuFragment.xml

    <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      tools:context=".Menu">

      <Button
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:id="@+id/convertBtn"
          android:text="Convert USD/IDR" />

      <Button
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:id="@+id/logoutBtn"
          android:text="Logout"/>

  </LinearLayout>

这是我的bodyFragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".body">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/username_show"/>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您要在此处使用资源框架为您的每个片段和活动提供两种不同的布局。一种布局用于纵向,另一种布局用于横向。

结构如下:

res/
    layout/
        activity_home.xml
        fragment_body.xml
        fragment_menu.xml
    layout-land/
        activity_home.xml
        fragment_body.xml
        fragment_menu.xml

您无需在代码中执行任何操作。只需在“活动”中使用setContentView(R.layout.activity_home),系统就会自动为您选择正确的版本(人像或风景)。

类似地,您可以在片段中输入inflater.inflate(R.layout.fragment_body, parent, false),然后会自动为您选择正确的版本。

现在,您只需要确保不同的xml文件即可完成您想要的操作。例如,在肖像中,您可以使按钮与屏幕宽度匹配:

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    .../>

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    .../>

但是在您的环境中,您可以将按钮包装起来:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    .../>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    .../>

只要在横向和纵向版本中使用相同的id,一切都会“正常”。