2010-07-27 4 views
4

Можно ли загрузить файл макета main.xml в onCreate(), а затем в приложении, переключиться на новый формат XML? Я попытался разместить setContentView() позже в приложении, но, похоже, на самом деле не устанавливает новый вид, потому что мои ссылки на объекты во вновь заданном файле макета XML возвращаются как null. Я попытался сделать разметку макета с помощью LayoutInflater, но мне не повезло (я, вероятно, что-то не так) ...Возможно ли обмен таблицами XML во время выполнения на Android?

Так есть ли другой способ поменять макеты xml-макетов во время выполнения? Спасибо!

ответ

11

У вас могут быть ваши макеты в одном файле xml. Те, которые вы не хотите видеть сразу, установите android:visibility="gone" в XML, и во время выполнения вы сделаете звонок до hiddenView.setVisibility(View.VISIBLE);.

Ваш XML будет выглядеть примерно так:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout android:id="@+id/layout1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    </LinearLayout> 
    <LinearLayout android:id="@+id/layout2" 
     android:visibility="gone" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    </LinearLayout> 
</RelativeLayout> 

во время выполнения вы можете сделать:

layout1.setVisibility(View.GONE); 
layout2.setVisibility(View.VISIBLE); 

Это по существу создать внешний вид свопинга макетов.

Я считаю, что это также сработает, если у вас есть общие объекты между двумя макетами. Просто убедитесь, что вы сначала установили идентификатор, используя android:id="@+id/view1", и каждый последующий параметр этого идентификатора вы бы сделали android:id="@id/view1" (без +).

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout android:id="@+id/layout1" 
     android:layout_width="fill_parent"> 
     <View android:id="@+id/view1"/> 
    </LinearLayout> 
    <LinearLayout android:id="@+id/layout2" 
     android:visibility="gone" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <View android:id="@id/view1"/> 
    </LinearLayout> 
</RelativeLayout> 
+1

Мне очень нравится этот ответ. Я лично использую ViewFlipper для управления несколькими макетами, поэтому мне не нужно управлять переменными [Resource], входящими в область действия и из-за того, что их макет установлен в виде содержимого. Оба подхода являются жизнеспособными. –

+0

А, у меня нет опыта работы с классом ViewFlipper. Я должен проверить это в следующий раз, когда мне нужно сделать что-то подобное. – SSZero

+0

О, ничего себе не сработало: D Спасибо! – justinl

1

Не можете ли вы просто создать новое мероприятие? В противном случае, я думаю, вы, возможно, захотите взглянуть на удаление просмотров из основного контейнера и перестройку кода вашего UI-кода. setContentView может быть вызван только один раз за активность, если я хорошо помню ...

+0

Привет! К сожалению, я попытался сделать новую работу, но мне нужен переход, чтобы быть бесшовным. Похоже, что при загрузке новой активности происходит определенное время загрузки, чего я не могу. – justinl

+0

ps - Я действительно считаю, что вы правы в том, что setContentView() разрешено только один раз звонить. Он не генерирует исключения, но когда я пытаюсь получить доступ к макетам с помощью findViewById(), он дает мне нулевой указатель при попытке ссылаться на эти переменные. – justinl

+0

Действительно, если вы хотите получить доступ к представлениям извне setContentView, вы должны следовать советам EboMike. Таким образом, вы можете вызвать findViewById в представлении, возвращаемом надувом. – Sephy

1

Я также думаю, что это действительно звучит так, как будто вы хотите новую активность, но я считаю, что вы можете повторно надуть что-то, если вручную удалить существующие виды и затем позвоните по телефону getLayoutInflater().inflate(resourceId, rootViewGroup).

+0

Спасибо за ваш ответ. Я дам это попробовать в следующий раз, когда я застрял! – justinl

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