addView(View) is not supported in AdapterView

J

JonasW

Gast
Hallo ich versuche aus dem Navigation Drawer ein neues Fragment einzubinden, welches eine ListView enthält. Doch bekomme ich immer diesen Fehlercode:
Code:
01-09 16:08:45.478: E/AndroidRuntime(13786): FATAL EXCEPTION: main
01-09 16:08:45.478: E/AndroidRuntime(13786): Process: com.example.trink_spiele, PID: 13786
01-09 16:08:45.478: E/AndroidRuntime(13786): java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.widget.AdapterView.addView(AdapterView.java:452)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:901)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.app.BackStackRecord.run(BackStackRecord.java:684)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.os.Handler.handleCallback(Handler.java:733)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.os.Handler.dispatchMessage(Handler.java:95)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.os.Looper.loop(Looper.java:136)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at java.lang.reflect.Method.invoke(Method.java:515)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-09 16:08:45.478: E/AndroidRuntime(13786): 	at dalvik.system.NativeStart.main(Native Method)

Und hier meine MainActivity:
Code:
package com.example.trink_spiele;

import android.os.Bundle;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {
	private String[] mTitles;
    private ListView mDrawerList;
    private CharSequence mTitle;
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mDrawerTitle;
    String title = "Trink-Spiele";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mTitles = getResources().getStringArray(R.array.titles_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);
       
        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mTitles));
        
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu();
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(
                this,
                mDrawerLayout,
                R.drawable.ic_drawer,
                R.string.drawer_open,
                R.string.drawer_close
                ) {

            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
	
	}

	private class DrawerItemClickListener implements ListView.OnItemClickListener {
	    @Override
	    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
	        selectItem(position);
	      
	    }	              
 }
	   
	private void selectItem(int position) {
		
	    Fragment fragment = new Fragment1();
	    Bundle args = new Bundle();
	    args.putInt(Fragment1.ARG_TITLES_NUMBER, position);
	    fragment.setArguments(args);

	    FragmentManager fragmentManager = getFragmentManager();
	    fragmentManager.beginTransaction()
	                   .replace(R.id.content_frame, fragment)
	                   .commit();

	    mDrawerList.setItemChecked(position, true);
	    setTitle(mTitles[position]);
	    mDrawerLayout.closeDrawer(mDrawerList);
	}

	@Override
	public void setTitle(CharSequence title) {
	    mTitle = title;
	    getActionBar().setTitle(mTitle);
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
          return true;
        }
        return super.onOptionsItemSelected(item);
    }

    //////////////////////////////////////////////////////////////
    
    public static class Fragment1 extends Fragment {
    
    	private String [] mAllTitles;
        private ListView mAllTitlesList;
    	public static final String ARG_TITLES_NUMBER = "titles_number";
    
    	public Fragment1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment0, container, false);
        
        mAllTitles = getResources().getStringArray(R.array.all_titles_array);
        mAllTitlesList = (ListView) rootView.findViewById(R.id.list);

        mAllTitlesList.setAdapter(new ArrayAdapter<String>(getActivity(),
                R.layout.drawer_list_item, mAllTitles));
        
        return rootView;
    }
}


}

Und hier meine xml zu der ListView:
Code:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:listSelector="@android:color/transparent"
        android:background="@android:color/background_light"
        android:divider="@android:color/black"
        android:dividerHeight="1dip"
        android:clickable="true">
        </ListView>
 

</LinearLayout>

Ich hoffe ihr könnt mir helfen
 
android - Unable to start activity:UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView - Stack Overflow
list - Android dev: UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView - Stack Overflow
android - java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView - Stack Overflow
android - ExpandableListView -UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView - Stack Overflow


Fleißaufgabe für dich, da mir auf den ersten Blick der Code stark nach dem Beispielcode ausschaut ... Vergleichs mit dem Code den du hier runterladen kannst: Creating a Navigation Drawer | Android Developers
(rechts oben,"Download the sample app")

Deine Layout-XML beinhaltet bspw. kein "<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />" (rauskopiert aus dem Beispiel).

Aber du versuchst eben das zu ersetzen:
"fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();"


Wenn du nicht weißt was dein Code macht, wirst du wieder und wieder an solchen Kleinigkeiten scheitern ;) Ja, auch Leute mit mehr Erfahrung ändern mal die ID eines Elementes in der XML, vergessen es aber im Code umzubennen (bzw. suchen nach der falschen ID im Code, etc.) und schon funktioniert was nicht ... Aber die wissen wenigstens direkt, was man daraufhin zu tun hat :) Lerne bitte die Grundlagen. Kopier dir nicht nur Code halbherzig von irgendwo zusammen (und das nicht mal vollständig), sondern verstehe was wo passiert.
 
Nein, der Teil fehlt eben nicht bei mir, denn die ListView mit der "content_frame" id ist in der mainactivity xml vorhanden. Und ich bin so gut wie es ging nach dem Beispiel der Google Developer vorgegangen.
 
Dann zeig auch mal deine activity_main.xml, wenn das oben die anscheinend nicht ist ... Was genau ist dann die ListView-XML dort oben?
 
Also hier die mainactivity.xml (aus dem Beispiel der Developer entnommen):
Code:
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- The main content view -->
    <ListView
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <ListView 
        style="@style/drawer"
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="#ffcccccc"
        android:dividerHeight="1dp"
        android:background="@android:color/background_light"
        />
</android.support.v4.widget.DrawerLayout>

Also was ich versuche, ist, dass wenn ich ein Item in der Liste anklicke, ich eine ListView angezeigt bekomme, die man ebenfalls anklicken kann. Und diese ListView ist die xml, die ich oben bereits erwähnt hatte
 
Danke, dass du dir die Links garnicht erst anschaust ;)
android - Unable to start activity:UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView - Stack Overflow

ListViews können keine Kinderelemente haben (wow, übersetzt klingt das ... naja ...).
Also mach aus:

Code:
<ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:listSelector="@android:color/transparent"
        android:background="@android:color/background_light"
        android:divider="@android:color/black"
        android:dividerHeight="1dip"
        android:clickable="true">
        </ListView>

Code:
<ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:listSelector="@android:color/transparent"
        android:background="@android:color/background_light"
        android:divider="@android:color/black"
        android:dividerHeight="1dip"
        android:clickable="true"/>
 
Ich hatte das auch schon probiert, aber es funktioniert immer noch nicht ;)
 
Hmm, dann füg mal Log-Ausgaben hinzu um genau rauszufinden wo er bei dir aussteigt :) (so grenzt du schon mal ein wo was passieren kann ...)
 
Code:
01-09 19:35:41.928: I/Adreno-EGL(24545): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
01-09 19:35:41.968: D/OpenGLRenderer(24545): Enabling debug mode 0
01-09 19:35:43.870: D/AndroidRuntime(24545): Shutting down VM
01-09 19:35:43.870: W/dalvikvm(24545): threadid=1: thread exiting with uncaught exception (group=0x41580ba8)
01-09 19:35:43.870: E/AndroidRuntime(24545): FATAL EXCEPTION: main
01-09 19:35:43.870: E/AndroidRuntime(24545): Process: com.example.trink_spiele, PID: 24545
01-09 19:35:43.870: E/AndroidRuntime(24545): java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.widget.AdapterView.addView(AdapterView.java:452)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:901)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.app.BackStackRecord.run(BackStackRecord.java:684)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.os.Handler.handleCallback(Handler.java:733)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.os.Handler.dispatchMessage(Handler.java:95)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.os.Looper.loop(Looper.java:136)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at java.lang.reflect.Method.invoke(Method.java:515)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-09 19:35:43.870: E/AndroidRuntime(24545): 	at dalvik.system.NativeStart.main(Native Method)
 
Hä? Jetzt hast du einfach zwei Zeilen mehr oben rauskopiert?

Android Logging Tutorial

Du sollst in deinen Code-Logausgaben hinzufügen um damit genau rausfinden zu können, bei welcher Anweisung dir die Exception geworfen wird.
 
Also ich bin wirklich neu in der Programmierung und versuche so weit wie es geht mit zu kommen aber kannst du mir genauer erklären wie man das macht? Bin auf deine genannte Seite gegangen, aber wie sehe ich jetzt, wo er nicht mehr weitermacht?
 
Zuletzt bearbeitet:
int a = 1;
a++;
Log.d("Meine eigene Logausgabe", "Der Wert der Variable a ist: " + a);
Das zaubert dir deine eigene Ausgabe ins Logcat (dort wo du die Fehlermeldungen herhast)

Jetzt kannst du bspw. das machen:
Code:
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        Log.d("Meine eigene Logausgabe", "Vor inflate fragment0");
        View rootView = inflater.inflate(R.layout.fragment0, container, false);
        

        Log.d("Meine eigene Logausgabe", "Vor mAllTitles = getResources...");
        mAllTitles = getResources().getStringArray(R.array.all_titles_array);


        Log.d("Meine eigene Logausgabe", "Vor mAllTitlesList");
        mAllTitlesList = (ListView) rootView.findViewById(R.id.list);


        Log.d("Meine eigene Logausgabe", "Vor dem Adapter setzen");
        mAllTitlesList.setAdapter(new ArrayAdapter<String>(getActivity(),
                R.layout.drawer_list_item, mAllTitles));
        
        return rootView;
    }

Wenn jetzt der Fehler in dieser Methode (OnCreateView des Fragments) liegt, dann kannst du so rausfinden an welcher Stelle genau. Wenn er noch " Vor mAllTitlesList" ausgibt, aber "Vor dem Adapter setzen" nicht mehr bevor deine Errormeldung erscheint, weißt du bspw. dass irgendwas mit dem Adapter setzen nicht funktioniert und kannst dann explizit dich da näher einlesen, nachhaken, rumprobieren,....


Damit anstatt jedes Mal "meine eigene Logausgabe" hinschreiben zu müssen, definiert man irgendwo eine Konstante und bindet die bei jeder Logausgabe ein, so kann man sehr gut im Logfenster nach seinen eigenen Ausgaben filtern.
 
Ich habs einfach mal übernommen, aber alle sind da:
Code:
01-09 21:07:15.109: D/OpenGLRenderer(1651): Enabling debug mode 0
01-09 21:07:17.212: D/Meine eigene Logausgabe(1651): Vor inflate fragment0
01-09 21:07:17.212: D/Meine eigene Logausgabe(1651): Vor mAllTitles = getResources...
01-09 21:07:17.212: D/Meine eigene Logausgabe(1651): Vor mAllTitlesList
01-09 21:07:17.212: D/Meine eigene Logausgabe(1651): Vor dem Adapter setzen
01-09 21:07:17.212: D/AndroidRuntime(1651): Shutting down VM

Und jetzt?
 
Sorry, aber dass du einfach weitere eigene Statements ausgeben könntest, darauf muss ich dich jetzt nicht wirklich hinweisen? ... Sorry, aber ich stell dir jetzt nicht komplett kopierfertigen Code hin. Versuche die Stelle selbst einzugrenzen ... (das es in der OnCreateView liegt war meine Annahme, anscheinend lag ich falsch ... )
 
Also an den für mich verdächtigen Stellen habe ich nichts gefunden, aber die Fehlermedlung bezieht sich ja auf android.widget.AdapterView.addView. Und die einzige Stelle, an der AdapterView benutzt wird, ist hier:
Code:
private class DrawerItemClickListener implements ListView.OnItemClickListener {
		
		@Override
	    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
			selectItem(position);
	        
	    }	              
 }
 
hast du die Doku zu AdapterView gelesen?
Adapter View kann keine .addView.
AdapterView | Android Developers
This method is not supported and throws an UnsupportedOperationException when called.

Parameters

child Ignored.
Throws

UnsupportedOperationException Every time this method is invoked.

Das liegt daran, dass die AdapterView über den Adapter gefüllt wird.
Die ListView ist auch eine AdapterView, ich vermute der FragmentManager nutzt die addView Methode um irgendwas hinzuzufügen.
Das funktioniert aber nicht wenn da eine ListView vorhanden ist.

Laut diesem Eintrag hier:
android - I got "addView(View) is not supported in AdapterView" error when use Fragment - Stack Overflow
Musst du ListFragment statt ListView nutzen.
 
Bekomme immer noch den Fehler :thumbdn:
 
Habs geschafft: in der activity_main.xml war "content_frame" bereits eine ListView, also hab ichs einfach in FrameLayout geändert und alles funktioniert :)
 
kleinerkathe schrieb:
Fleißaufgabe für dich, da mir auf den ersten Blick der Code stark nach dem Beispielcode ausschaut ... Vergleichs mit dem Code den du hier runterladen kannst: Creating a Navigation Drawer | Android Developers
(rechts oben,"Download the sample app")

...

Wenn du nicht weißt was dein Code macht, wirst du wieder und wieder an solchen Kleinigkeiten scheitern ;) Ja, auch Leute mit mehr Erfahrung ändern mal die ID eines Elementes in der XML, vergessen es aber im Code umzubennen (bzw. suchen nach der falschen ID im Code, etc.) und schon funktioniert was nicht ... Aber die wissen wenigstens direkt, was man daraufhin zu tun hat :) Lerne bitte die Grundlagen. Kopier dir nicht nur Code halbherzig von irgendwo zusammen (und das nicht mal vollständig), sondern verstehe was wo passiert.

Siehste, ganz am Anfang: Vergleich deinen Code nochmals mit dem Beispielcode und finde raus was du anders hast ... d.h. die Lösung bzw. der Weg zur Lösung stand direkt in der ersten Antwort ;)
 
Ja ;) und ne kleine Frage noch zum Schluss:
Muss ich unbedingt für ne String Array bei jedem Item mit <item>...</item> schreiben, weil ich hab ne menge an texten. Oder sollte ich lieber ne textfile im raw ordner nehmen?
 

Ähnliche Themen

Chrilos
Antworten
9
Aufrufe
582
koje71
koje71
D
Antworten
23
Aufrufe
2.514
Data2006
D
OnkelLon
Antworten
13
Aufrufe
1.974
OnkelLon
OnkelLon
Zurück
Oben Unten