Android Fragment раздувать макет - PullRequest
0 голосов
/ 18 октября 2011

Привет, я работаю с пейджером и фрагментами. Я хотел бы переопределить изменения ориентации, чтобы метод 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 просто не распознал, что это было в альбомной ориентации, так как я переопределил его, но изменение макета на что-то смешное, например макет для диалога, не вызывает принудительное закрытие или что-то еще, что сохраняет макет портрета, который растягивается в результате я знаю, что что-то не так с тем, как я раздуваю макет.

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

Спасибо!

1 Ответ

2 голосов
/ 28 декабря 2011

1) Вы должны поместить все свои процедуры проверки сервера и другие одноразовые операции во Fragment onCreate (), а не onCreateView ().Если вам нужно показать какой-то экран «Загрузка ...» во время загрузки, то я бы рекомендовал использовать FragmentActivity , чтобы накачать макет хотя бы с FrameLayout , который содержитТип «Загрузка ...».Сначала FragmentActivity будет запускать onCreate (), в котором сначала будет раздуваться начальное представление, а затем создается фрагмент.Поместите проверочный код сервера в onCreate () фрагмента, а затем разведите любое представление для этого фрагмента в методе 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, который вы создаете для фрагмента.(Например, если этот фрагмент может раздувать различные представления для информации, гула и лирики, то имена моих тегов для каждого фрагмента микрофона будут 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 Вы можете определить различные макеты в зависимости от размера экрана, языка, режима док-станции, ночного режима и любой их комбинации.

...