2

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

Я создал макет земли (layout-sw720dp-land/example.xml) и порт (layout-sw720dp-port/example.xml).

Пока все не будет правильно.

В порту макета, я дал точные размеры и расположение земли другие точные размеры ...

Раньше у меня была проблема с переключателем двух макетов.

Переход от горизонтального к вертикальному расположению прошел успешно, но активность была разрушена и перестроена.

Я решил проблему путем вставки в AndroidManifest.xml этот код:

android:configChanges="orientation|screenSize" 

Теперь проблема заключается в том, что переход от горизонтального до вертикального не является автоматическим. Например, я открываю приложение по горизонтали, и приложение отображает правильный макет (layout-sw720dp-land/example.xml, потому что я использую планшет), но как только приложение открывается, и я поворачиваю планшет вертикально, вертикальная компоновка не отображается, но остается в горизонтальной версии .. (например, в горизонтальном макете у меня есть кнопка, что ее текст «Старт», а в вертикальном - у меня есть ту же кнопку, что и его текст «Готово», и когда приложение открыто и Я поворачиваю планшет от горизонтального до вертикального поворота макета, заставляя меня видеть, однако, горизонтальную версию, поэтому с кнопкой «Пуск»).

Как я могу сделать, чтобы показать правильный макет БЕЗ воссоздания и уничтожения активности?

NB: Используя фрагмент ... Короче говоря, у меня есть файл activity_main.xml, что ссылки на деятельность «MainActivity.java», что внутри у него есть этот код:

<FrameLayout 
     android:layout_below="@+id/toolbar" 
     android:id="@+id/fragment_container" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:foreground="@drawable/shadow_toolbar"/> 

внутри этого FrameLayout I просматривать две раскладки таким образом:

FragmentExample fragment = new FragmentExample(); 
     android.support.v4.app.FragmentTransaction fragmentTransaction = 
       getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.fragment_container, fragment); 
     fragmentTransaction.commit(); 

в FragmentExample.java есть два знаменитых расположение:

public class FragmentExample extends Fragment { 


public FragmentExample() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.example, container, false); 

    // Inflate the layout for this fragment 
    return rootView; 
} 

}

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

Извините за мой английский =)

+0

переопределить метод onConfigChanges и делать все, что вы хотите –

+0

Обратите внимание, что это может звучать намного проще, чем есть на самом деле, особенно в зависимости от уровня сложности в отношении вашего макета. Не то, чтобы это действительно «полезно», но оно стоит взвешивать, если оно того стоит. – zgc7009

+0

вы можете разместить небольшой пример для двух макетов с помощью этого метода? пожалуйста =) –

ответ

0

Вы не можете использовать два различные макеты для портретного режима ландшафта и без воссоздания деятельности. Параметр android:configChanges="orientation|screenSize" говорит, что активность не воссоздает себя, но не работает должным образом, потому что в этом случае другой файл макета не установлен.

Если вы хотите использовать два различные макеты для пейзажного и портретного режима затем удалить android:configChanges="orientation|screenSize" от вашей активности в AndroidManifest.xml и обрабатывать сохранение и восстановление состояния активности с помощью методов onSaveInstanceState(Bundle outState) и onRestoreInstanceState(Bundle savedInstanceState).

Пример (see full article):

public class MainActivity extends AppCompatActivity { 

    // These variable are destroyed along with Activity 
    private int someVarA; 
    private String someVarB; 

    ... 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("someVarA", someVarA); 
     outState.putString("someVarB", someVarB); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     someVarA = savedInstanceState.getInt("someVarA"); 
     someVarB = savedInstanceState.getString("someVarB"); 
    } 
} 

См this solution, чтобы сохранять и восстанавливать фрагменты.

См. Также Handling Runtime Changes Документация.

 Смежные вопросы

  • Нет связанных вопросов^_^