Макет Android Fragment Inflate

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

Вот что я настроил до сих пор

У меня есть это на MainActivity в манифесте

 android:configChanges="orientation|keyboardHidden"

И затем я использую это в своем фрагменте

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
    getLayoutInflater(getArguments()).inflate(R.layout.main, null, false);
    Toast.makeText(getActivity(), "changed orientation", Toast.LENGTH_LONG).show();
}

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

Будем очень благодарны за любую помощь в изменении макета при изменении ориентации на странице просмотра.

Благодарю вас!


person user577732    schedule 17.10.2011    source источник


Ответы (1)


1) Вы должны поместить все процедуры проверки вашего сервера и другие одноразовые операции в Fragment onCreate(), а не в onCreateView(). Если вам нужно показать какой-то экран «Загрузка...» во время загрузки, я бы рекомендовал использовать FragmentActivity для раздувания макета, по крайней мере, с FrameLayout, который содержит графику типа "Загрузка...". Во-первых, FragmentActivity запустится onCreate(), в которой сначала будет развернуто начальное представление, а затем создан экземпляр фрагмента. Поместите код проверки сервера в onCreate() Фрагмента, а затем раздуйте любой View для этого Фрагмента в его методе onCreateView(). Вот пример из одного из моих проектов, который инициализирует кнопку микрофона, которая на самом деле является фрагментом:

<FrameLayout
       android:id="@+id/recorder_mic_fragment"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       />

Затем фрагмент микрофона фактически создается с помощью следующего кода Java:

// make the Mic button
FragmentManager fragMgr = getFragmentManager();
FragmentTransaction xact = fragMgr.beginTransaction();
if (null == fragMgr.findFragmentByTag(FRAG_TAG)) {
    xact.add(R.id.mic_button_frame, MicFragment.newInstance(queryType), FRAG_TAG).commit();
}

FRAG_TAG на самом деле является уникальным именем тега, которое вы даете экземпляру фрагмента и которое отличается от R.id фрагмента. Таким образом, вы можете использовать findFragmentByTag(), чтобы убедиться, что фрагменты создаются правильно во всех местах, где они вам нужны.

Вы можете немного изменить этот код, если хотите загружать фрагменты внутри фрагментов, например, как на самом деле работает мое приложение. Если у вас есть фрагмент, который будет расширять одно из нескольких возможных представлений, используйте оператор if, чтобы выбрать соответствующий идентификатор кадра и назначить уникальный FRAG_TAG. Я бы посоветовал использовать разные R.id для каждого FrameLayout, который вы создаете для фрагмента. (Например, если этот фрагмент может отображать разные представления для Info, Hum и Lyrics, тогда моими именами тегов для каждого фрагмента микрофона будут MetaMicButton, HumMicButton и LyricsMicButton. Мне также нужно выбрать между R.id.meta_mic_button_frame и т. д.)

2) Когда вы переключаетесь между портретным и ландшафтным режимами, вам необходимо определить различные макеты XML в папках res/layout и res/layout_land. (Или вы можете сделать res/layout и res/layout_port, если хотите использовать альбомный режим по умолчанию). Пожалуйста, проверьте эту ссылку: http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources Вы можете определить различные макеты в зависимости от размера экрана, языка, режима док-станции, ночного режима и любой их комбинации.

person Stephen Wylie    schedule 28.12.2011