Ответ 1
Ориентационный атрибут - за активность, поэтому вы можете объявлять ориентацию только для активности, содержащей фрагмент, чтобы он был в ландшафте, а остальные действия оставались такими, каковы они есть.
Мое приложение должно быть в портретном режиме, поэтому я установил его в манифесте:
android:screenOrientation="portrait"
Но я недавно добавил еще один фрагмент (FragA), который просто выглядит и работает в 10 раз лучше в ландшафте. Есть ли что-то, что я могу помещать внутри моего FragA, чтобы просто сделать этот фрагмент в ландшафте, оставив при этом остальное приложение в портрете или сделав это, я должен добавить что-то к своим другим фрагментам, чтобы сохранить их в виде портрета?
Ориентационный атрибут - за активность, поэтому вы можете объявлять ориентацию только для активности, содержащей фрагмент, чтобы он был в ландшафте, а остальные действия оставались такими, каковы они есть.
Используйте следующую строку кода в фрагменте, где требуется конкретная (в данном случае портретная) ориентация.
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Если вы хотите иметь ориентацию в фрагменте, основанный на том, как пользователь держит свое устройство, используйте следующую строку кода.
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Надеюсь, это даст вам предполагаемое решение.
В каждом из ваших фрагментов установите требуемую ориентацию.
Справочный документ: 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);
}
В вашем фрагменте 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 вернет вашу активность в портретную ориентацию
Так что я сейчас занимаюсь этим вопросом. У нас есть только приложение в портретном режиме (пока). Но есть один фрагмент, который должен быть в ландшафте. Мы используем единый подход "Активность", поэтому принятый ответ мне не поможет.
Самое быстрое решение, о котором я мог подумать, это одно.
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. В начале, когда фрагмент создан, он изменит ориентацию, только когда нет сохраненного состояния. И ориентация возвращается обратно только тогда, когда она не изменяется в настоящее время.
Это очень быстрое решение, которое может вызвать мигание экрана при возврате к предыдущему фрагменту. Я также не полностью протестировал его, чтобы он мог иметь другие проблемы, так что имейте это в виду.
Первый фрагмент:
@Override
public void onResume() {
super.onResume();
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Второй фрагмент:
@Override
public void onResume() {
super.onResume();
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
Это старый вопрос, но ответить на него можно только в том случае, если кто-то захочет найти решение, необходимое для ОП. Простой способ добиться этого заключается в следующем.
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);
...
}
}