Изменить макет Android программно - PullRequest
2 голосов
/ 15 декабря 2010

Я запускаю свое приложение с макетом main.xml следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/relative" xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <ImageButton android:id="@+id/applogo" ... android:src="@drawable/app_logo"/>
    <TabHost android:id="@android:id/tabhost" ... android:layout_below="@+id/applogo">
        <LinearLayout ...>
            <TabWidget.../>
            <FrameLayout android:id="@android:id/tabcontent"...>
            </FrameLayout>
        </LinearLayout>
    </TabHost>
</RelativeLayout>

И пользователь в меню настроек может выбрать другой макет, меньший (tiny.xml), чей макет такой:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/relative" xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <TabHost android:id="@android:id/tabhost" ...>
        <LinearLayout ...>
            <TabWidget.../>
            <FrameLayout android:id="@android:id/tabcontent"...>
            </FrameLayout>
        </LinearLayout>
    </TabHost>
</RelativeLayout>

mainActivity расширяет TabActivity и в методе onCreate:

...

if (isTiny())
setContentView(R.layout.tiny);
else
setContentView(R.layout.main);
mTabHost = getTabHost();

TabSpec newsTab = mTabHost.newTabSpec(NewsActivity.static_getTabActivityTag());
newsIntent = new Intent(this, NewsActivity.class);      
newsTab.setContent(newsIntent);
TextView textView = new TextView(this);

textView.setText(getResources().getString(NewsActivity.static_getIndicatorStringID());
textView.setTextSize(size);
textView.setTextColor(color);
textView.setBackgroundDrawable(background);
tab.setIndicator(textView);
mTabHost.addTab(newsTab);

Идея состоит в том, чтобы написать некоторый код вmainActivity#onRestart поэтому, если пользователь изменил макет через панель настроек, загрузите новый макет для него.Как этого добиться?Я попытался использовать setContentView , но он просто вылетает и снова создает представления для вкладок, но он просто не работает, представления пустые.

Обновлено: добавлено, как создать вкладкув Activity.

Обновление Можно сделать несколько раз setContentView.Моя проблема была связана с действиями в Намерении.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Вы можете вызвать setContentView в любое время, когда он не должен быть включен в onCreate.Я бы использовал SharedPreferences для хранения того, какое представление контента хочет пользователь.Надеюсь, это поможет.

0 голосов
/ 14 апреля 2019

Для размещения фрагментов я делаю это так:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (MainActivity.isDarkMode) {
        return inflater.inflate(R.layout.layout_dark, container, false);
    } else {
        return inflater.inflate(R.layout.layout_light, container, false);
    }
}

Итак, вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...