Får krasch när jag vill använda selector, varför?

Diskussion i 'Frågor, support och diskussion' startad av Sigma78, 11 jan 2011.

  1. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 jul 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Jag kan inte förstå varför min app kraschar så fort jag vill använda en selector för att ändra bakgrundsfärgen på mina listitems i en ListView när man klickar på dem.

    Problemet jag försöker lösa är att så fort jag sätter android:background så försvinner färgmarkeringen som visar vilket ListItem man klickar på, och jag vill få tillbaka den.

    listselector.xml:
    HTML:
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    	<item android:background="#000000" />
    </selector>
    
    forumheader.xml som fungerar:
    HTML:
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"  
      android:id="@+id/rowTextView"
      android:layout_width="fill_parent"   
      android:layout_height="fill_parent"
     android:background="#E8F0FF"
      android:textSize="19dp"
      android:padding="10dp"
      android:textColor="#FF000000"
      android:gravity="center_vertical">
      </TextView>
    forumheader.xml som kraschar vid start
    HTML:
     <TextView xmlns:android="http://schemas.android.com/apk/res/android"  
      android:id="@+id/rowTextView"
      android:layout_width="fill_parent"   
      android:layout_height="fill_parent"
     android:background="@layout/listselector"
      android:textSize="19dp"
      android:padding="10dp"
      android:textColor="#FF000000"
      android:gravity="center_vertical">
      </TextView>
    forumposts_layout.xml
    HTML:
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout android:id="@+id/ForumPostLayout"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     xmlns:android="http://schemas.android.com/apk/res/android">
     <ListView android:id="@+id/ListView01"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent" 
     android:cacheColorHint="#00000000"
     android:background="#FFFFFF"
     />
     
     </LinearLayout>
    Koden i huvudprogrammet är inget speciellt:
    Kod:
    	protected ListView mListView;
    [hopp till inne i onCreate]
        	mListView=(ListView)findViewById(R.id.ListView01);
    //    	mListView.setSelector(R.drawable.listselector);
    //    	mListView.setDrawSelectorOnTop(true);
    
    Om jag tar in någon av de bortkommenterade raderna kraschar det också vid start. Så fort jag gör någon referens till listselector.xml kraschar det.

    För felsökningens skull har jag tömt listselector.xml på allt utom det allra minsta, så att den inte ska påverka, det ska klart in mer saker där.

    Edit: Det var visst besvärligt att klistra in XML-kod här :)
     
    Last edited: 11 jan 2011
  2. tomas_b

    tomas_b Kid Droid Medlem

    Blev medlem:
    23 mar 2010
    Inlägg:
    97
    Mottagna gillanden:
    4

    MINA ENHETER

    Något stacktrace i logcat?

    Har svaga minnen ifrån när jag lekte med selectors en gång, men jag har för mig att man inte kunde sätta färgen på det sättet utan att man var tvungen att ha en drawable där istället, dvs. en shape.
     
  3. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 jul 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Hur får jag fram stacktrace?
    Jag är novis på det här, men det låter som något jag borde veta :)

    Edit: Är det detta du menar?
    Kod:
    Thread [<1> main] (Suspended (exception InflateException))	
    	ListView.layoutChildren() line: 1662	
    	ListView(AbsListView).onLayout(boolean, int, int, int, int) line: 1147	
    	ListView(View).layout(int, int, int, int) line: 7035	
    	LinearLayout.setChildFrame(View, int, int, int, int) line: 1249	
    	LinearLayout.layoutHorizontal() line: 1238	
    	LinearLayout.onLayout(boolean, int, int, int, int) line: 1044	
    	LinearLayout(View).layout(int, int, int, int) line: 7035	
    	FrameLayout.onLayout(boolean, int, int, int, int) line: 333	
    	FrameLayout(View).layout(int, int, int, int) line: 7035	
    	PhoneWindow$DecorView(FrameLayout).onLayout(boolean, int, int, int, int) line: 333	
    	PhoneWindow$DecorView(View).layout(int, int, int, int) line: 7035	
    	FrameLayout.onLayout(boolean, int, int, int, int) line: 333	
    	FrameLayout(View).layout(int, int, int, int) line: 7035	
    	LinearLayout.setChildFrame(View, int, int, int, int) line: 1249	
    	LinearLayout.layoutVertical() line: 1125	
    	LinearLayout.onLayout(boolean, int, int, int, int) line: 1042	
    	LinearLayout(View).layout(int, int, int, int) line: 7035	
    	TabHost(FrameLayout).onLayout(boolean, int, int, int, int) line: 333	
    	TabHost(View).layout(int, int, int, int) line: 7035	
    	FrameLayout.onLayout(boolean, int, int, int, int) line: 333	
    	FrameLayout(View).layout(int, int, int, int) line: 7035	
    	LinearLayout.setChildFrame(View, int, int, int, int) line: 1249	
    	LinearLayout.layoutVertical() line: 1125	
    	LinearLayout.onLayout(boolean, int, int, int, int) line: 1042	
    	LinearLayout(View).layout(int, int, int, int) line: 7035	
    	PhoneWindow$DecorView(FrameLayout).onLayout(boolean, int, int, int, int) line: 333	
    	PhoneWindow$DecorView(View).layout(int, int, int, int) line: 7035	
    	ViewRoot.performTraversals() line: 1045	
    	ViewRoot.handleMessage(Message) line: 1727	
    	ViewRoot(Handler).dispatchMessage(Message) line: 99	
    	Looper.loop() line: 123	
    	ActivityThread.main(String[]) line: 4627	
    	Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]	
    	Method.invoke(Object, Object...) line: 521	
    	ZygoteInit$MethodAndArgsCaller.run() line: 868	
    	ZygoteInit.main(String[]) line: 626	
    	NativeStart.main(String[]) line: not available [native method]
     
    Last edited: 11 jan 2011
  4. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 jul 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Jag har kommit på orsaken till att detta händer nu. Selector kräver att man har ett element av typen android:drawable, det fungerar alltså inte med android:background.

    Jag har hittat att jag kan sätta android:drawable="@android:color/white" t.ex. för att få vit bakgrund. Vad jag inte har lyckats hitta är hur jag gör för att definiera en färg själv om jag inte gillar det fåtal färger som finns att välja mellan med bokstavsnamn.
     
  5. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 jul 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Detta var riktigt klurigt minsann, jag får inte rätt på det. Så här har jag försökt:
    colors.xml (ligger i /res/values)
    HTML:
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <drawable name="opaque_red">#ffff0000</drawable>
        <drawable name="transparent_red">#80ff0000</drawable>
        <drawable name="opaque_blue">#0000ff</drawable>
        <drawable name="opaque_green">#0f0</drawable>
    </resources>
    listselector.xml
    HTML:
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    	<item android:state_pressed="true"
    	android:drawable="@android:color/white" />
    	<item android:drawable="@drawable/opaque_red" />
    </selector>
    Näst sista raden i listselector ger felet: "Error: No resource found that matches the given name (at 'drawable' with value '@drawable/opaque_red')."
    Jag har provat att ha colors.xml i /res/drawable och /res/drawable-hdpi också, med samma resultat.

    Vad kan vara fel? Jag tycker att jag har följt exempel jag har hittat exakt.
     
    Last edited: 12 jan 2011
  6. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Last edited: 12 jan 2011
  7. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 jul 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Jag vill skapa egna färger, som drawables, inte som color, eftersom när man sätter android:background som en selector måste den innehålla en android:drawable.

    Här är ett exempel som jag har försökt lär mig av t.ex.
    https://sites.google.com/site/creadorgranoeste/guide/drawable-resources

    Enkelt uttryckt vill jag kunna ange egna färger istället för att ange t.ex. @android:color/white och vara bunden till de färger som har ett namn.

    Edit: Nu fick jag det att fungera. Jag vet inte riktigt vad som var fel, men nu gick det med att deklarera färgerna med <color> och sen anropa dem med @color/färgnamn i selectorn.
     
    Last edited: 12 jan 2011