Изменение макета при изменении ориентации фрагментов Android

android android-layout android-fragments

8739 просмотра

7 ответа

26 Репутация автора

Пожалуйста, предложите решение.

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

Мой код удар:

 <activity
        android:name=".activites.MainActivity"
        android:launchMode="singleInstance"
        android:configChanges="keyboardHidden|screenLayout|screenSize|orientation"
        />

Это основной макет, называемый приборной панелью, и теперь он находится в портретном режиме:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     View  view=View.inflate(getContext(), R.frag_dashboard,null);
     changeview= (ShimmerTextView)view.findViewById(R.id.changeview); 
     return view;
}

когда я поворачиваю экран, этот фрагмент переключается в альбомный режим и задает другой макет, а молитвенный_размеси - новый макет.

   @Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(getContext(), "landscape", Toast.LENGTH_SHORT).show();
        view=View.inflate(getContext(), R.layout.prayer_times,null);

    }
}

и я создаю layout_land для молитвенников

Автор: AndroidSRS Источник Размещён: 19.07.2016 05:18

Ответы (7)


0 плюса

4498 Репутация автора

Все, что вам нужно сделать, это открыть новую layout-landпапку внутри вашей resпапки и поместить туда XML с тем же именем макета вашего фрагмента, фреймворк будет знать, что нужно искать при .xmlизменении ориентации. Смотрите здесь для деталей.

Автор: Nir Duan Размещён: 19.07.2016 05:25

2 плюса

48 Репутация автора

Если onCreateViewфункция вызывается при повороте экрана, вы можете сделать это в ней:

if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE) {
    ......
} else if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT) {
    .........
}
Автор: sky Размещён: 19.07.2016 06:38

0 плюса

444 Репутация автора

По умолчанию макеты в / res / layout применяются как к книжной, так и к альбомной ориентации.
Если у вас есть, например,

/res/layout/main.xml

Вы можете добавить новую папку / res / layout-land, скопировать в нее файл main.xml и внести необходимые изменения.

См. Также http://www.androidpeople.com/android-portrait-amp-landscape-differeent-layouts и http://www.devx.com/wireless/Article/40792/1954 для получения дополнительных возможностей.

Автор: Vinothkumar Nataraj Размещён: 19.07.2016 07:23

1 плюс

377 Репутация автора

То, что вы пытаетесь сделать, довольно сложно. Фрагменты Android не предназначены для поворота. У меня была та же проблема, и я нашел решение, хотя. В моем случае я хотел представить фрагмент, содержащий разные страницы меню, которые будут вращаться в соответствии с ориентацией.

Просто создайте Фрагмент, который служит основой и содержит простой LinearLayout (или любой другой тип макета, который вы хотите). Этот LinearLayout будет служить основой для нашего меню:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/llMenuCanvas"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

</LinearLayout>

Далее мы хотим закодировать фрагмент базового элемента как абстрактный класс, который будет реализован всеми фрагментами пункта меню:

public abstract class NavMenuItem extends Fragment {

    static final String TAG = "yourTag"; // Debug tag

    LinearLayout canvas;
    View hView; // we'll keep the reference of both views
    View vView;

    // All we'll need to do is set these up on our fragments
    abstract int getVerticalLayoutResource();
    abstract int getHorizontalLayoutResource();
    abstract void setupUI(); // assigns all UI elements and listeners

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.menu_base, container, false); // sets up the layout for this fragment

        // keeping our references to both layout versions
        hView = inflater.inflate(getHorizontalLayoutResource(), container, false);
        vView = inflater.inflate(getVerticalLayoutResource(), container, false);

        canvas = view.findViewById(R.id.llMenuCanvas); // this is the magic part: Our reference to the menu canvas

        // returning our first view depending on orientation
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
            canvas.addView(hView);
        }else{
            canvas.addView(vView);
        }
        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        setupUI(); // here we set up our listeners for the first time
    }

    // Here we update the layout when we rotate the device
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        canvas.removeAllViews();

        // Checking screen orientation
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            canvas.addView(hView);
        }
        else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            canvas.addView(vView);
        }
        setupUI(); // we always need to rebind our buttons

    }

}

А вот пример фрагмента пункта меню, который вращается в соответствии с ориентацией устройства.

public class NavMenuMain extends NavMenuItem{

    static final String TAG = "yourTag"; // Debug tag

    // Your layout references, as usual
    ImageButton btnCloseMenu;

    // here we set up the layout resources for this fragment
    @Override
    int getVerticalLayoutResource() { // vertical layout version
        return R.layout.menu_main_port;
    }

    @Override
    int getHorizontalLayoutResource() { // horizontal layout version
        return R.layout.menu_main_land;
    }

    @Override
    void setupUI(){

        // Setup button listeners and layout interaction here

        // REMEMBER: the names of your layout elements must match, both for landscape and portrait layouts. Ex: the "close menu" button must have the same id name in both layout versions

    }

}

Надеюсь, это поможет.

Автор: Luís Henriques Размещён: 14.03.2018 02:37

9 плюса

2353 Репутация автора

Это старый вопрос, но я думаю поделиться своим решением.

если у вашего фрагмента нет проблем с перезагрузкой при изменении ориентации, вы можете просто перезагрузить.

Добавьте два макета с одинаковым именем в layoutи layout-landпапки. это покажет правильно ориентированный макет при загрузке, для изменения макета при повороте устройства добавьте следующее в методе onConfigarationChanged.

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE || newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        try {
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            if (Build.VERSION.SDK_INT >= 26) {
             ft.setReorderingAllowed(false);
            }
            ft.detach(this).attach(this).commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Автор: UdayaLakmal Размещён: 26.06.2018 09:55

1 плюс

518 Репутация автора

Поздно, но это поможет кому-то

Попробуйте это в V4 Fragment

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        if (getFragmentManager() != null) {
            getFragmentManager()
                    .beginTransaction()
                    .detach(this)
                    .attach(this)
                    .commit();
        }
    }
Автор: Tara Размещён: 02.01.2019 12:15

0 плюса

253 Репутация автора

Когда вы меняете ориентацию, ваш фрагмент снова уничтожается и воссоздается ( см. Это для лучшего понимания ). Таким образом, в onConfigurationChanged вы раздуваете свой новый макет, но это бесполезно, потому что, когда ваш фрагмент воссоздается, onCreateView вызывается снова; другими словами, ваш старый макет снова раздут. Так что лучше сделать это следующим образом:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View  view;

    if(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

        view = View.inflate(getContext(), R.frag_dashboard,null);
        changeview = (ShimmerTextView)view.findViewById(R.id.changeview);
    } else(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

        Toast.makeText(getContext(), "landscape", Toast.LENGTH_SHORT).show();
        view = View.inflate(getContext(), R.layout.prayer_times,null);
    }

    return view;
}
Автор: Shift Delete Размещён: 02.01.2019 08:31
Вопросы из категории :
32x32