2011-12-29 4 views
0

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

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

Только удаление fragment из макета, похоже, делает загрузку приложения, независимо от того, что еще я делаю, приложение аварийно завершает работу.

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

12-29 04:52:07.493: E/AndroidRuntime(11717): java.lang.RuntimeException: Unable to resume activity {com.p5sys.android.jump/com.p5sys.android.jump.lib.activities.DisplayContactList}: android.view.InflateException: Binary XML file line #9: Error inflating class fragment

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

12-29 04:52:07.493: E/AndroidRuntime(11717): Caused by: java.lang.IllegalArgumentException: Binary XML file line #9: Duplicate id 0x7f090023, tag null, or parent id 0x0 with another fragment for 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> 

Мой Fragment класс:

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

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

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

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. Если у вас есть только один экземпляр фрагмента, вы можете называть его чем угодно; в противном случае лучше всего назначить имя тега как что-то, связанное с тем, что появляется в этом конкретном экземпляре.

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

+0

Чувак, 5 часов, пытаясь исправить это «все» проблемы и ваше решение установил его в 1 секунду! Любить это! – Ali

0

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

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

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

+0

Спасибо за помощь, но я попытался заменить «TableLayout» простым «TextView», и это тоже не сработало. Я попробую с помощью простых «FrameLayout» и «TextView» и посмотрю, поможет ли это. – Ali

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