Работает ли LayoutInflater с XML-файлом макета, который использует include? - PullRequest
0 голосов
/ 02 февраля 2011

Вот в чем проблема: у меня есть макет, который использует тег include.Схема проста ->

<LinearLayout>
  <TextView ...>

  <LinearLayout>
     <include ...>
  </LinearLayout>
</LinearLayout>

Теперь включаемый файл - не более чем:

<LinearLayout>
  <TextView ... android:id="@+id/inner_text">
</LinearLayout>

Теперь, если я попытаюсь получить доступ к внутреннему тексту TextView при вызове create или onStartБросает NPE.Я пытался использовать LayoutInflater, чтобы наполнить включенный XML-файл и затем получить доступ к inner_text, но безрезультатно - он всегда терпит неудачу.

Итак, вопрос: работает ли LayoutInflater с включенными XML-файлами родительского XML-файла?То, что я хотел бы сделать, это захватить содержимое включенного xml-файла и установить все это как видимое или невидимое в зависимости от предпочтений.

Кажется, ничто не позволяет мне захватить объект TextView.

Теперь, когда я включаю xml как вложенный элемент в родительский файл (без использования тега include), он просто получает доступ к LinearLayout, но это противоречит моей цели - попытаться создать макетдинамическое представление - то есть я могу по желанию изменять содержимое включенного дочернего макета - и не нужно вносить никаких изменений в родительский макет.

Любая помощь, указатели, предложения -> приветствуется.

Ответы [ 3 ]

0 голосов
/ 02 февраля 2011

Что ж, очень странно, когда вы надуваете представление из любого ресурса xml (если ресурсы xml имеют или не имеют вложенных ресурсов с помощью include), представление должно содержать все проанализированные xml.Итак, да, LayoutInflater работает с включенными xml-файлами родительского xml-файла.

Я скопировал здесь, как делаю сейчас ...

мой общий макет (заголовок с текстом,индикатор выполнения и изображение)

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

    <ImageView
        android:id="@+id/genericHeaderLogoPin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:src="@drawable/logo_pin"/>

    <TextView
        android:id="@+id/genericHeaderTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@id/genericHeaderLogoPin"
        android:textSize="18dip"
        android:textStyle="bold"
        android:textColor="#FF0C9994"/>

    <ProgressBar
        android:id="@+id/genericHeaderProgressBar"
        android:layout_width="25dip"
        android:layout_height="25dip"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@id/genericHeaderLogoPin"
        style="@android:style/Widget.ProgressBar.Inverse"
        android:visibility="gone"/>

</RelativeLayout>

мой родительский макет ... включает общий макет и ListView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  android:background="@drawable/background_new_search_activity_1">

    <include layout="@layout/generic_header_layout" android:id="@+id/listaBusquedasHeader"/>

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:cacheColorHint="#00000000"/>

</LinearLayout>

мой метод onCreate, который раздувает родительский макет, упомянутый выше:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        LayoutInflater inflater = LayoutInflater.from(this);
        View view = inflater.inflate(R.layout.lista_busquedas_activity, null);

        setContentView(view);
        listView = (ListView) findViewById(android.R.id.list);
        listView.setOnItemClickListener(listItemClickListener);

        ((TextView)findViewById(R.id.genericHeaderTitle)).setText(R.string.messagesActivityTitle);
    }

и это все, надеюсь, это поможет вам.

0 голосов
/ 08 февраля 2011

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

Работает теперь благодаря вашим примерам кода.

Thanx.

0 голосов
/ 02 февраля 2011

В качестве рекомендации, я думаю, вы можете иметь в основном XML некоторые компоненты Layout, оставленные пустыми, они во время выполнения раздувают основной xml, затем включенный xml и добавляют содержимое включенного в пространство, оставленное вами в основном. 1001 *

Но я думаю, что ваш пример должен работать, внутри Android использует инфлятор для раздувания ресурсов. Можете ли вы отредактировать и рассказать немного больше? Примеры кода могут быть полезными.

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