Фрагмент Android не работает - PullRequest
       0

Фрагмент Android не работает

0 голосов
/ 29 декабря 2011

Я пытаюсь реализовать простой фрагмент в Android.

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

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

Я получаю следующую ошибку:

12-29 04: 52: 07.493: E / AndroidRuntime (11717): java.lang.RuntimeException: невозможно возобновить активность {Com.p5sys.android.jump / com.p5sys.android.jump.lib.activities.DisplayContactList}: android.view.InflateException: строка двоичного файла XML №9: ошибка раздувать фрагмент класса

Я также получаю следующую ошибку после вышеперечисленных ошибок в стеке трассировки (просто если это помогает, если это полезно).

12-29 04: 52: 07.493: E / AndroidRuntime (11717): вызвано: java.lang.IllegalArgumentException: строка двоичного XML-файла # 9: дубликат id 0x7f090023, тэг null или родительский идентификатор 0x0 с другим фрагментом для com.p5sys.android.jump.lib.fragment.HeaderFragment

Мой макет contact_layout.xml - это LinearLayout с fragment и ListView в нем:

<fragment
    android:id="@+id/headerFragment"
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    class="com.p5sys.android.jump.lib.fragment.HeaderFragment" />

<ListView
    android:id="@+id/contactList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:background="@color/transparent"
    android:cacheColorHint="#00000000" >
</ListView>

Фрагмент макета header_fragment.xml - это:

<TableRow>
    <ImageButton
        android:id="@+id/btnSettings"
        android:gravity="left"
        android:hint="@string/label_settings"
        android:onClick="btnAction_launchSettings"
        android:padding="3dip"
        android:src="@drawable/ic_menu_add" />

    <TextView
        android:id="@+id/headerText"
        android:gravity="center"
        android:height="50dip"
        android:padding="3dip"
        android:textSize="20sp"
        android:textStyle="bold"
        android:text="Blank" />

    <ImageButton
        android:id="@+id/btnAdd"
        android:background="@drawable/disconnectbutton"
        android:gravity="right"
        android:hint="@string/label_add"
        android:onClick="btnAction_launchAddNew"
        android:padding="3dip"
        android:src="@drawable/ic_menu_add" />
</TableRow>

Класс моего фрагмента:

package com.p5sys.android.jump.lib.fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.p5sys.android.jump.lib.R;
/***
 * Fragment
 * @author Ali
 *
 */
public class HeaderFragment extends Fragment {

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // inflate layout
        return inflater.inflate(R.layout.header_fragment, container, false);
//      LinearLayout ll = new LinearLayout(getActivity());
//      TextView tv = new TextView(getActivity());
//      tv.setText("hello world");
//      ll.addView(tv);
//      return ll;
    }
}

В своей деятельности я не делаю ничего особенного, я пытался использовать обычные Activity, а также FragmentActivity, и у меня возникла та же проблема.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011

Мне никогда особо не везло с таким подходом. Кроме того, в любом случае вам придется делать это по-другому, если вы хотите создать экземпляр множества типов фрагментов в одном и том же месте макета или пролистать множество фрагментов пальцем (через ViewPager) и т. Д. .

Итак, вот что я делаю: 1) Используйте FrameLayout, чтобы зарезервировать место для фрагмента.

<FrameLayout
    android:id="@+id/where_i_want_my_fragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

2) Создайте фрагмент с помощью следующего кода Java:

FragmentManager fragMgr = getFragmentManager();
FragmentTransaction xact = fragMgr.beginTransaction();
if (null == fragMgr.findFragmentByTag(myFragTag)) {
    xact.add(R.id.where_i_want_my_fragment, MyDerivedFragment.newInstance(), myFragTag).commit();
}

myFragTag - это строковое значение, которое вам нужно придумать. Это имя тега, которое вы хотите назначить экземпляру Fragment, аналогично атрибуту «id» в HTML. Если у вас есть только один экземпляр Fragment, вы можете называть его как угодно; в противном случае лучше всего указывать имя тега как нечто, связанное с тем, в чем этот конкретный экземпляр появляется.

Не забудьте про часть commit() в самом конце, иначе она не будет работать!

0 голосов
/ 29 декабря 2011

Если вы хотите вообще взаимодействовать со своим фрагментом (и, возможно, даже если нет), ваша деятельность должна быть фрагментной.

Причина, по которой вы получаете эту ошибку, состоит в том, что TableRowне действительный родитель.Вам нужно использовать какой-то вид ViewGroup.Я понятия не имею, почему вы используете tablerow здесь, но вы не должны использовать его.Попробуйте горизонтальный линейный макет.Если цель состоит в том, чтобы иметь равномерный интервал, присвойте всем макетный вес 1 в xml.

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

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