Реализация динамического макета Android - PullRequest
0 голосов
/ 07 января 2012

Я реализую макет Android, который действует как своего рода инструкция по эксплуатации. В общем, у меня есть несколько страниц, которые пользователь может пролистать. Допустим, я реализовал это так:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:id="@+id/page_1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <!-- Put stuff for page 1 -->
    </LinearLayout>
    <LinearLayout
        android:id="@+id/page_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="INVISIBLE">
        <!-- Put stuff for page 2 -->
    </LinearLayout>
    <LinearLayout
        android:id="@+id/page_3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="INVISIBLE">
        <!-- Put stuff for page 3 -->
    </LinearLayout>

    <!-- ... -->

    <LinearLayout
        android:id="@+id/page_N"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="INVISIBLE">
        <!-- Put stuff for page N -->
    </LinearLayout>
</FrameLayout>

По сути, я бы имитировал «эффект перелистывания страниц» (возможно, с помощью анимации), чтобы сделать текущую страницу невидимой и сделать новую страницу видимой. Однако у этой реализации есть некоторые проблемы:

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

Я подумал, есть ли способ динамически загрузить страницу из файла XML во время выполнения. Например, можно ли надувать конкретный макет всякий раз, когда этого требует пользователь? Или, если у кого-то есть лучшая реализация, которой у меня нет, пожалуйста, скажите мне!

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Вы можете просто использовать ViewFlipper для этой цели и динамически добавлять представления в flipper по мере необходимости пользователя для этой страницы.

1 голос
/ 07 января 2012

Используйте флиппер вида, например

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

<ViewFlipper
    android:id="@+id/viewflipper"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:id="@+id/page_1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <!-- Put stuff for page 1 -->
    </LinearLayout>
    <LinearLayout
        android:id="@+id/page_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="INVISIBLE">
        <!-- Put stuff for page 2 -->
    </LinearLayout>
    <LinearLayout
        android:id="@+id/page_3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="INVISIBLE">
        <!-- Put stuff for page 3 -->
    </LinearLayout>

    <!-- ... -->

    <LinearLayout
        android:id="@+id/page_N"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="INVISIBLE">
        <!-- Put stuff for page N -->
    </LinearLayout>
  </ViewFlipper>
</FrameLayout>

Теперь, чтобы переключаться между различными представлениями, вы бы (в вашем Java-файле)

ViewFlipper flipper = (ViewFlipper) findViewById(R.id.viewflipper);
flipper.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.exit_slide_right_left));
flipper.setOutAnimation(AnimationUtils.loadAnimation(mContext,R.anim.enter_slide_right_left));
flipper.setDisplayedChild(n);

, который будет скользить, как будто вы двигаетесь вперед, файл анимации выглядит следующим образом:

(enter_slide_right_left.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
         android:shareInterpolator="false">
        <translate android:fromXDelta="0%" android:toXDelta="-100%"
          android:fromYDelta="0%" android:toYDelta="0%"
         android:duration="700"/>
       </set>

и (exit_slide_right_left.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
         android:shareInterpolator="false">
      <translate
       android:fromXDelta="100%" android:toXDelta="0%"
       android:fromYDelta="0%" android:toYDelta="0%"
       android:duration="700" />
    </set>
0 голосов
/ 07 января 2012

Может быть, каждая страница имеет отдельный ресурс?Таким образом, вы можете просто поместить все страницы в массив и извлекать отдельные страницы по индексу.

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