Изменить ширину фрагмента при изменении ориентации - PullRequest
0 голосов
/ 26 мая 2019

В настоящее время я изучаю разработку для Android Studio и наткнулся на учебное упражнение (застрял почти на 2 недели).Мне потребовалось использовать Fragment для создания этого вида:

См. Изображение

Вот мой код:

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>

Как вы можете видеть, если я запускаю эти коды, в портретном режиме он работает как картинка.

Но когда я изменяюОриентация на альбомную, Кнопка по-прежнему работает в полноэкранном режиме.

Как я могу изменить кнопку, чтобы она была только какой-то частью, подобной изображению?

Примечание: это мой первый Q в stackOverflow об Android.Я надеюсь, что мое объяснение достаточно ясное

Редактировать

Вот мое менюFragment.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 голосов
/ 27 мая 2019

То, что вы хотите здесь сделать, - это использовать Resources Framework , чтобы предоставить два разных макета для каждого из ваших Фрагментов и вашей Деятельности.Один макет предназначен для портретной ориентации, а другой - для альбомной ориентации.

Структура будет выглядеть следующим образом:

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), и правильная версия будет выбрана автоматически дляyou.

Теперь вам просто нужно убедиться, что ваши разные 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 s в альбомной и портретной версиях, все будет "просто работать".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...