2016-11-07 11 views
0

Ich habe ein Projekt (https://github.com/checklist/NestedFragmentsRecycler) mit verschachtelten Fragmenten. FragmentA befindet sich in der MainActivity und enthält RecyclerView mit einem Adapter. Jedes der Elemente im Adapter wird im Gegenzug FragmentB haben. Da ich eine ID geben muss, um FragmentB in Position zu bringen, und es muss eindeutig sein, erzeuge ich meine eigenen IDs. Die ersten Fragmente werden gezeigt in Ordnung, aber leider ist der Moment, als ich Scrollen starten, erhalte ich eine Ausnahme, dass meine eindeutige ID kann nicht gefunden werden: Android verschachtelte Fragmente mit einem RecyclerView

W/Resource

: Keine Paketkennung, wenn der Name für die Ressourcen bekommen Nummer 0x00000004 E/FragmentManager: Keine Ansicht für ID 0x4 (unbekannt) für Fragment FragmentB {30cad9b # 3 id = 0x4} E/FragmentManager: Aktivitätsstatus: D/FragmentManager: Local FragmentActivity 6d29cb6 Status: D/FragmentManager: mCreated = truemResumed = true mStopped = false mReallyStopped = false D/FragmentManager:
mloadersStarted = true D/FragmentManager: Aktive Fragmente in a2d5538: D/FragmentManager: # 0: fragmenta {6.948.911 # 0 id = 0x7f0b0056} D/FragmentManager: mFragmentId = # 7f0b0056 mContainerId = # 7f0b0056 mTag = null D/FragmentManager: mstate = 5 Mindex = 0 mWho = android: Fragment : 0 mBackStackNesting = 0 D/FragmentManager:
mAdded = true mRemoving = false mFromLayout = false mInLayout = false D/FragmentManager: mHidden = false mDetached = false mMenuVisible = true mHasMenu = false D/FragmentManager:
mRetainInstance = false mRetaining = false mUserVisibleHint = true D/FragmentManager: mFragmentManager = FragmentManager {a2d5538 in HostCallbacks {327ba76}} D/FragmentManager:
mHost = und [email protected] D/FragmentManager: mArgumente = Bundle [{}] D/FragmentManager:
mContainer = android.widget.FrameLayout {ffe8877 VE ..... .... .... 128,32-2432,1496 # 7f0b0056 App: id/fragmenta} D/FragmentManager:
MVIEW = android.widget.LinearLayout {ffe8ce4 VE ..... ........ 0,0-2304,1464} D/FragmentManager:
mInnerView = android.widget.LinearLayout {ffe8ce4 VE ........ 0,0-2304,1464} D/FragmentManager: Child FragmentManager {aa7a54d in FragmentA {6948911}}: D/FragmentManager: Aktive Fragmente in aa7a54d: D/FragmentManager: # 0: FragmentB {44d0802 # 0 id = 0x1} D/FragmentManager: mFragmentId = # 1 mContainerId = # 1 mTag = null D/FragmentManager: mstate = 5 Mindex = 0 mWho = android: Fragment: 0: 0 mBackStackNesting = 0 D/FragmentManager:
mAdded = true mRemoving = false mFromLayout = false mInLayout = false D/FragmentManager: mHidden = false mDetached = false mMenuVisible = true mHasMenu = false D/FragmentManager:
mRetainInstance = false mRetaining = false mUserVisibleHint = true D/FragmentManager:
mFragmentManager = FragmentManager {aa7a54d in FragmentA {6948911}} D/FragmentManager:
mHost = android.support.v4.app.FragmentActivity $ HostCallbac ks @ 327ba76 D/FragmentManager: mParentFragment = fragmenta {6948911 # 0 id = 0x7f0b0056} D/FragmentManager:
mArguments = Bundle [{TEXT = Dies ist Fragment B: 0}] D/FragmentManager:
mContainer = android .widget.FrameLayout {c93513 VE ..... ........ 0,0-800,1464 # 1} D/FragmentManager:
mView = android.widget.LinearLayout {3899350 VE ........ 0,0-800,1464} D/FragmentManager:
mInnerView = android.widget.LinearLayout {3899350 VE ........ 0,0-800,1464} D/FragmentManager: Kind FragmentManager {c564949 in FragmentB {44d0802 }}: D/FragmentManager:
FragmentManager misc Zustand: D/FragmentManager:
[email protected]a76 D/FragmentManager:
mContainer = android.support.v4.app .Fragment $ 1 @ 287a24e D/FragmentM anager: mParent = FragmentB {44d0802 # 0 id = 0x1} D/FragmentManager: mCurState = 5 mStateSaved = false mDestroyed = false D/FragmentManager: # 1: FragmentB {d880f6f # 1-ID = 0x2} D/FragmentManager:
mFragmentId = # 2 mContainerId = # 2 mTag = null D/FragmentManager:
mstate = 5 Mindex = 1 mWho = android: Fragment: 0: 1 mBackStackNesting = 0 D/FragmentManager: mAdded = true mRemoving = false mFromLayout = falsch mInLayout = false D/FragmentManager:
mHidden = false mDetached = false mMenuVisible = true mHasMenu = false D/FragmentManager: mRetainInstance = false mRetaining = false mUserVisibleHint = true D/FragmentManager: 012.380. mFragmentManager FragmentManager = {aa7a54d in fragmenta 6.948.911 { }} D/FragmentManager:
[email protected]a76 D/FragmentManager: mParentFragment fragmenta = { 6.948.911 # 0 id = 0x7f0b0056} D/FragmentManager:
mArgumente = Bundle [{TEXT = Das ist Fragment B: 1}] D/FragmentManager:
mContainer = android.widget.FrameLayout {67c947c VE ..... ...... .. 0,0-800,1464 # 2} D/FragmentManager:
mView = android.widget.LinearLayout {c313105 VE ..... ........ 0,0-800,1464 } D/FragmentManager:
mInnerView = android.widget.LinearLayout {c313105 VE ........ 0,0-800,1464} D/FragmentManager: Kind FragmentManager {cbf955a in FragmentB {d880f6f}}: D/FragmentManager:
FragmentManager misc Zustand: D/FragmentManager:
[email protected]a76 D/FragmentManager:
mContainer = android.support.v4.app.Fragment $ 1 @ ab0338b D/FragmentManager: mParent = FragmentB {d880f6f # 1 ID = 0x2} D/FragmentManager: mCurState = 5 mStateSaved = false mDestroyed = false D/FragmentManager: # 2: FragmentB {53c7c68 # 2 id = 0x3} D/FragmentManager:
mFragmentId = # 3 mContainerId = # 3 mTag = null D/FragmentManager:
mstate = 5 Mindex = 2 mWho = android: Fragment: 0: 2 mBackStackNesting = 0 D/FragmentManager: mAdded = true mRemoving = false mFromLayout = false mInLayout = false D/FragmentManager:
mHidden = false mDetached = false mMenuVisible = true mHasMenu = false D/FragmentManager: mRetainInstance = false mRetaining = false mUserVisibleHint = true D/FragmentManager:
mFragmentManager = FragmentManager {aa7a54d in FragmentA {6948911}} D/FragmentManager:
mHost = android.support.v4.app.FragmentActivity $ HostCallbacks @ 327ba76 D/FragmentManager: mParentFragment = fragmenta {6948911 # 0 id = 0x7f0b0056} D/FragmentManager:
mArguments = Bundle [{TEXT = Dies ist Fragment B: 2}] D/FragmentManager:
mContainer = android.widget.FrameLayout {918d881 VE ........ 0,0-800,1464 # 3} D/FragmentManager:
mView = android.widget.LinearLayout {651ad26 VE. ............. 0,0-800,1464} D/FragmentManager:
mInnerView = android.widget.LinearLayout {651ad26 VE ..... ........ 0,0-800,1464} D/FragmentManager: Kind FragmentManager {4ec7d67 in FragmentB {53c7c68}}: D/FragmentManag Er:
FragmentManager misc Zustand: D/FragmentManager:
[email protected]a76 D/FragmentManager:
[email protected] D/FragmentManager: mParent = FragmentB {53c7c68 # 2 id = 0x3} D/FragmentManager: mCurState = 5 mStateSaved = false mDestroyed = false D/FragmentManager: # 3: FragmentB {30cad9b # 3 id = 0x4} D/FragmentManager:
mFragmentId = # 4 mContainerId = # 4 mTag = null D/FragmentManager:
mState = 1 mIndex = 3 mWho = android: Fragment: 0: 3 mBackStackNesting = 0 D/FragmentManager: mAdded = true mRemoving = false mFromLayout = false mInLayout = false D/FragmentManager:
mHidden = false mDetached = false mMenuVisible = true mHasMenu = false D/FragmentManager: mRetainInstance = false mRetaining = false mUserVisibleHint = wahr D/FragmentManager:
mFragmentManager FragmentManager = {aa7a54d in fragmenta 6.948.911 { }} D/FragmentManager:
[email protected]a76 D/FragmentManager: mParentFragment = {6.948.911 fragmenta # 0 id = 0x7f0b0056} D/FragmentManager:
mArgumente = Bündel [{TEXT = Dies ist Fragm ent B: 3}] D/FragmentManager:
Hinzugefügte Fragmente: D/FragmentManager: # 0: FragmentB {44d0802 # 0 ID = 0x1} D/FragmentManager: # 1: FragmentB {d880f6f # 1 id = 0x2} D/FragmentManager: # 2: FragmentB {53c7c68 # 2 id = 0x3} D/FragmentManager: # 3: FragmentB {30cad9b # 3 id = 0x4} D/FragmentManager: FragmentManager misc Zustand: D/FragmentManager:
mHost = [email protected] D/FragmentManager:
[email protected] D/FragmentManager: mParent = fragmenta {6948911 # 0 id = 0x7f0b0056 } D/FragmentManager: mCurS tate = 5 mStateSaved = false mDestroyed = false D/FragmentManager: Hinzugefügt Fragmente: D/FragmentManager: # 0: fragmenta {6948911 # 0 id = 0x7f0b0056} D/FragmentManager: FragmentManager misc Zustand: D/FragmentManager:
[email protected]a76 D/FragmentManager:
mContainer = android.support.v4.app.Fragment_Activity $ HostCallbacks @ 327ba76 D/FragmentManager: mCurState = 5 mStateSaved = falsch mDestroyed = false I/art: Teilweise Code-Cache-Sammlung, Code = 30KB, Daten = 27KB I/art: Nach Code-Cache-Sammlung, Code = 29KB , data = 27KB I/art: Erhöhung Code-Cache-Kapazität zu 128KB D/FragmentManager: Hierarchie anzeigen: D/FragmentManager: com.android.internal.policy.DecorView {99b75b2 VE .... ... 0,0 -2560,1800} D/FragmentManager:
android.widget.LinearLayout {eb98903 VE .... ... 0,0-2560,1704} D/FragmentManager: android.view.ViewStub {8.107.080 GE ... . 0,0-0,0 # 10203ef android: id/aktionsmode_bar_stub} D/FragmentManager:
andro id.widget.FrameLayout {44716b9 VE .... ... 0,48-2560,1704} D/FragmentManager:
android.support.v7.widget.ActionBarOverlayLayout {7473afe VE .... ... 0,0-2560,1656 # 7f0b0044 App: id/decor_content_parent} D/FragmentManager:
android.support.v7.widget.ContentFrameLayout {bc1b25f VE .... ... 0,128-2560,1656 # 1020002 android : id/content} D/FragmentManager:
android.widget.RelativeLayout {a4c14ac VE .... ... 0,0-2560,1528

7f0b0055 App: id/activity_main} D/FragmentManager: android. widget.FrameLayout {ffe8877 VE .... ... 128,32-2432,1496

7f0b0056 App: id/fragmenta} D/FragmentManager: android.widget.LinearLayout {ffe8ce4 VE .... ... 0,0-2304,1464}

D/FragmentManager:
android.support .v7.widget.RecyclerView {9b96575 VFEDH ... F .. 0,0-2304,1464 # 7f0b0057 app: id/listView} D/FragmentManager:
android.widget.LinearLayout {e58090a VE ..... .. -19,0-781,1464} W/ResourceType: Keine Paketkennung beim Abrufen des Namens für die Ressource Nummer 0x00000001 D/FragmentManager:
android.widget.FrameLayout {c93513 VE .... ... 0, 0-800,1464 # 1} D/FragmentManager:
android.widget.LinearLayout {3.899.350 VE .... ... 0,0-800,1464} D/FragmentManager:
android.support.v7.widget.AppCompatTextView {5f9157b V. ED .... ... 0,0-254,38 # 7f0b0070 App: ID/TextView} D/FragmentManager:
android.widget.LinearLayout {7bbcf98 VE .... ... 781,0-1581 , 1464} W/ResourceType: Keine Paketkennung beim Abrufen des Namens für Ressource Nummer 0x00000002 D/FragmentManager:
android.widget.FrameLayout {67c947c VE .... ... 0,0-800,1464 # 2} D/FragmentManager:
android.widget.LinearLayout {c313105 VE .... ... 0 , 0-800,1464} D/FragmentManager:
android.support.v7.widget.AppCompatTextView {bc7e3f1 V.ED .... ... 0,0-254,38 # 7f0b0070 app: id/textView } D/FragmentManager:
android.widget.LinearLayout {8f5abd6 VE .... ... 1581,0-2381,1464} W/ResourceType: Keine Paketkennung beim Abrufen des Namens für die Ressource Nummer 0x00000003 D/FragmentManager:
android.widget.FrameLayout {918d881 VE .... ... 0,0-800,1464 # 3} D/FragmentManager:
android.widget.LinearLayout {651ad26 VE .... ... 0 , 0-800,1464} D/FragmentManager:
android.support.v7.widget.AppCompatTextView {8798e57 V.ED .... ... 0,0-254,38 # 7f0b0070 app: ID/Textansicht} D/FragmentManager:
android.support.v7.widget.ActionBarContainer {36a4d44 V.ED .... ... 0,0-2560,128 # 7f0b0045 app: id/aktionsbar_container} D/FragmentManager: android.support.v7.widget.Toolbar {e65ce2d VE ..... .. 0,0-2560,128

7f0b0046 App: id/action_bar} D/FragmentManager: android.support.v7.widget.AppCompatTextView {9f8af62 V.ED .... ...

48 , 37-153,91} D/FragmentManager:
android.support.v7.widget.ActionMenuView {c1eb8f3 VE .... ... 2544,0-2544,128} D/FragmentManager:
android.support.v7.widget.ActionBarContextView {460f9b0 GE .... ... 0,0-0,0 # 7f0b0047 app: id/action_context_bar} D/FragmentManager:
android.view.View {77e2029 V.ED .... ... 0,1704-2560,1800 # 1020030 android: id/navigationBarBackground} D/FragmentManager:
android.view.View {7365fae V.ED .... ... 0,0-2560,48 # 102002f android: id/statusBarBackground} D/AndroidRuntime: Herunterfahren der VM E/AndroidRuntime: FATALE AUSNAHME: Haupt Prozess: example.com .demo, PID: 8156 java.lang.IllegalArgumentException: Keine Ansicht für ID 0x4 (unknown) für Fragment FragmentB {30cad9b # 3 id = 0x4} bei android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1107) bei android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1295) bei Android. support.v4.app.BackStackRecord.run (BackStackRecord.java:801) bei android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1682) bei android.support.v4.app.FragmentManagerImpl $ 1.run (FragmentManager.java:541) bei android.os.Handler.handleCallback (Handler.java:751) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper .java: 154) bei android.app.ActivityThread.main (ActivityThread.java:6119) bei java.lang.reflect.Method.invoke (systemeigene Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776) Disconnected von der Ziel-VM, Adresse: 'localhost: 8616', Transport: 'socket'

die 2 wichtigsten Klassen sind FragmentAAdapter und FragmentB (Sie können die anderen Klassen sehen können, wenn Sie müssen im git Repo):

public class FragmentAAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ 

FragmentA fragmentA; 
Activity activity; 
RecyclerView listView; 

public FragmentAAdapter(FragmentA fragmentA, Activity activity, RecyclerView listView) { 
    this.fragmentA = fragmentA; 
    this.activity = activity; 
    this.listView = listView; 
} 


@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_b, parent, false); 
    RecyclerView.ViewHolder vh = new BoardViewHolder(v, this); 
    return vh; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof BoardViewHolder){ 
     BoardViewHolder pHolder = (BoardViewHolder)holder; 
     pHolder.onBindViewHolder(position); 
    } 
} 

@Override 
public int getItemCount() { 
    return 10; 
} 

public class BoardViewHolder extends RecyclerView.ViewHolder { 

    FragmentAAdapter adapter; 
    FragmentB fragmentB; 
    View view; 

    public BoardViewHolder(View itemView, FragmentAAdapter adapter) { 
     super(itemView); 

     this.view = itemView; 
     this.adapter = adapter; 
    } 

    public void onBindViewHolder(int position) { 

     FragmentManager fm = fragmentA.getChildFragmentManager(); 
     if (fragmentB==null) { 
      Bundle bundle = new Bundle(); 
      bundle.putString("TEXT", "This is Fragment B:" + position); 
      fragmentB = FragmentB.getInstance(bundle); 

      int boardId = generateViewId(); 
      // switch the id of the board to be unique 
      View board = view.findViewById(R.id.board); 
      board.setId(boardId); 

      // now flip fragmentB 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.replace(boardId, fragmentB); 
      ft.commit(); 
     } 
    } 
} 

private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); 

public static int generateViewId() { 
    for (;;) { 
     final int result = sNextGeneratedId.get(); 
     // aapt-generated IDs have the high byte nonzero; clamp to the range under that. 
     int newValue = result + 1; 
     if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. 
     if (sNextGeneratedId.compareAndSet(result, newValue)) { 
      return result; 
     } 
    } 
} 

}

und FragmentB:

public class FragmentB extends Fragment { 

View root; 

Activity activity; 

String text; 
private TextView textView; 

public static FragmentB getInstance(Bundle bundle) { 
    FragmentB instance = new FragmentB(); 
    instance.setArguments(bundle); 
    return instance; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    activity = (Activity) getActivity(); 

    if (getArguments()!=null) { 
     text = getArguments().getString("TEXT"); 

    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 

    root = inflater.inflate(R.layout.row, null, false); 

    textView = (TextView)root.findViewById(R.id.textView); 
    textView.setText(text); 

    return root; 
} 

}

Voll Code: https://github.com/checklist/NestedFragmentsRecycler

Dank!

+0

neue IDs generieren innen 'onCreateViewHolder', nicht' onBindViewHolder': Sie müssen so viele IDs wie viele Inhaber/Ansichten haben Sie – pskink

+0

bereits versucht, dass und erhalten die gleiche Ausnahme – checklist

+0

vor jedem Scrollen, was ist die Ausgabe des Befehls: 'adb Shell Dumpsys Aktivität oben '? – pskink

Antwort

1

Nach einer Menge Seelenforschung kann ich bestätigen, dass es nicht möglich ist IDs innerhalb von Fragmenten zu generieren. Wenn Sie dies tun, wird Android beim Rendern der Benutzeroberfläche und beim Absturz der App verwirrt.

Ich habe dies in einem anderen Projekt versucht, wo wir IDs für Optionsfelder und Gruppen generiert haben, die dynamisch generiert und innerhalb eines Fragments und des gleichen Verhaltens platziert wurden. Zwei Lösungen: - nicht programmatisch erstellen, damit Sie nicht erzeugen müssen ids - nicht Fragmente verwenden

Verwandte Themen