Подтвердить что ты не робот

Установка ориентации только для 1 фрагмента в моей активности, а остальная часть - в портретном

Мое приложение должно быть в портретном режиме, поэтому я установил его в манифесте:

android:screenOrientation="portrait"

Но я недавно добавил еще один фрагмент (FragA), который просто выглядит и работает в 10 раз лучше в ландшафте. Есть ли что-то, что я могу помещать внутри моего FragA, чтобы просто сделать этот фрагмент в ландшафте, оставив при этом остальное приложение в портрете или сделав это, я должен добавить что-то к своим другим фрагментам, чтобы сохранить их в виде портрета?

4b9b3361

Ответ 1

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

Ответ 2

Используйте следующую строку кода в фрагменте, где требуется конкретная (в данном случае портретная) ориентация.

getActivity().setRequestedOrientation(
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Если вы хотите иметь ориентацию в фрагменте, основанный на том, как пользователь держит свое устройство, используйте следующую строку кода.

getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

Надеюсь, это даст вам предполагаемое решение.

Ответ 3

В каждом из ваших фрагментов установите требуемую ориентацию.

Справочный документ: http://developer.android.com/reference/android/content/pm/ActivityInfo.html

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   // Fragment locked in portrait screen orientation
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);    

   // Fragment locked in landscape screen orientation
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

   // Fragment screen orientation normal both portait and landscape       
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

Ответ 4

В вашем фрагменте FragA:

@Override
public void onResume() {
    super.onResume();
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

}


@Override
public void onPause() {
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    super.onPause();
}

код метода onPause вернет вашу активность в портретную ориентацию

Ответ 5

Так что я сейчас занимаюсь этим вопросом. У нас есть только приложение в портретном режиме (пока). Но есть один фрагмент, который должен быть в ландшафте. Мы используем единый подход "Активность", поэтому принятый ответ мне не поможет.

Самое быстрое решение, о котором я мог подумать, это одно.

private var swappingOrientation = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    if(savedInstanceState == null) {
        swappingOrientation = true
        activity?.apply {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        }
    }
}

override fun onDestroy() {
    super.onDestroy()

    if(!swappingOrientation) {
        activity?.apply {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }
    }
    swappingOrientation = false
}

Вы храните информацию, если вы меняете ориентацию или нет в переменной swappingOrientation. В начале, когда фрагмент создан, он изменит ориентацию, только когда нет сохраненного состояния. И ориентация возвращается обратно только тогда, когда она не изменяется в настоящее время.

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

Ответ 6

Первый фрагмент:

@Override
    public void onResume() {
        super.onResume();
        getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    }

Второй фрагмент:

     @Override
        public void onResume() {
            super.onResume();
 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
   }

Ответ 7

Это старый вопрос, но ответить на него можно только в том случае, если кто-то захочет найти решение, необходимое для ОП. Простой способ добиться этого заключается в следующем.

public class SampleFragment {

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

       getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

       ...
    }

   @Override
   public View onDestroyView() {
       super.onDestroyView();
       ...

       getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

       ...
    }

}