2017-08-11 24 views
0

TL; DR: Mit der einfachen android:drawableLeft Funktionalität auf einem Textview führt zu einem AbsturzBild neben Text?

Die TextView ein von Androids grundlegendsten visuellen Elementen. Warum funktioniert dann die einfachste Funktion nicht?

https://developer.android.com/reference/android/widget/TextView.html#attr_android:drawableLeft

Mein Code ist einfach, es ist ein benutzerdefinierter Dialog ein Bild neben einem TextView mit:

<TextView 
     android:text="Text next to check mark" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     android:id="@+id/textView19" 
     android:drawableLeft="@drawable/ic_check_circle_white_24dp" 
     android:textSize="24sp" 
     android:textStyle="normal|bold"/> 

Der Code liefert beeindruckende Ergebnisse auf dem visuellen Editor:

enter image description here

Aber wenn das Programm tatsächlich ex ist ecuted, stürzt die einfache android:drawableLeft Funktionalität der App:

android.view.InflateException: Binary XML file line #64: Error inflating class TextView 

Full stacktrace


Ich versuche, den Dialog wie so öffnen:

dialog = new Dialog(this,R.style.Theme_AppCompat_Light_Dialog_Alert); 
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
dialog.setContentView(R.layout.premium_dialog); 
dialog.setCanceledOnTouchOutside(false); 

dialog.getWindow().setLayout((int) (getResources().getDisplayMetrics().widthPixels * 0.90), (int) (getResources().getDisplayMetrics().heightPixels * 0.90)); 

dialog.show(); 

Warum ist es, dass eine solche grundlegende Funktionalität ist die Ursache eines InflateException? (Ich weiß, dass es die drawableLeft-Funktion ist, die das Problem verursacht, denn wenn ich die TextView entferne, ist der Fehler verschwunden)

+0

Von Ihrem vollen Stack-Trace, wo haben Sie 'verwendet Verursacht durch: android.content.res.Resources $ NotFoundException: File ** res/ziehbar/abc_dialog_material_background.xml ** von Farbzustand Liste Ressource ID # 0x7f020011' –

+0

Sie können 'vectordrwable' nicht direkt in' Textview' mit einer niedrigeren API verwenden. Erstellen Sie CustomTextview, um Unterstützung für Vektor in Lower API zu geben –

Antwort

3

Versuchen Sie dieses auf setContentView

LayoutInflater layoutInflater = LayoutInflater.from(context); 
View promptView = layoutInflater.inflate(R.layout.premium_dialog, null); 
dialog.setContentView(promptView); 
+0

heruntergeladen Das funktioniert !? Warum funktioniert das? –

1

android:drawableLeft (und oben/rechts/unten) können nicht Vektor-Zeichensatz auf älteren API-Ebenen verwenden. Verwenden Sie entweder ein PNG-Zeichen oder verwenden Sie ein LinearLayout mit einem ImageView neben Ihrem TextView.

+0

Es ist ein PNG, ich habe das Häkchen von https://material.io/icons/#ic_check_circle –

3

eine CustomTextView für VectorDrawable in Lower API erstellen.

initilize Ihr Attribut Custom Textview, wie folgend:

private void initAttrs(Context context, AttributeSet attrs) { 
     if (attrs != null) { 
      TypedArray attributeArray = context.obtainStyledAttributes(attrs,R.styleable.CustomTextView); 
      //for font 
      String fontName = attributeArray.getString(R.styleable.CustomTextView_font); 

      try { 
       if (fontName != null) { 
        Typeface myTypeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/" + fontName); 
        setTypeface(myTypeface); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      Drawable drawableLeft = null; 
      Drawable drawableRight = null; 
      Drawable drawableBottom = null; 
      Drawable drawableTop = null; 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       drawableLeft = attributeArray.getDrawable(R.styleable.CustomTextView_drawableLeftCompat); 
       drawableRight = attributeArray.getDrawable(R.styleable.CustomTextView_drawableRightCompat); 
       drawableBottom = attributeArray.getDrawable(R.styleable.CustomTextView_drawableBottomCompat); 
       drawableTop = attributeArray.getDrawable(R.styleable.CustomTextView_drawableTopCompat); 
      } else { 
       final int drawableLeftId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableLeftCompat, -1); 
       final int drawableRightId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableRightCompat, -1); 
       final int drawableBottomId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableBottomCompat, -1); 
       final int drawableTopId = attributeArray.getResourceId(R.styleable.CustomTextView_drawableTopCompat, -1); 

       if (drawableLeftId != -1) 
        drawableLeft = AppCompatResources.getDrawable(context, drawableLeftId); 
       if (drawableRightId != -1) 
        drawableRight = AppCompatResources.getDrawable(context, drawableRightId); 
       if (drawableBottomId != -1) 
        drawableBottom = AppCompatResources.getDrawable(context, drawableBottomId); 
       if (drawableTopId != -1) 
        drawableTop = AppCompatResources.getDrawable(context, drawableTopId); 
      } 
      setCompoundDrawablesWithIntrinsicBounds(drawableLeft, drawableTop, drawableRight, drawableBottom); 
      attributeArray.recycle(); 
     } 
    } 

Ihre individuelle Styleable für gleiche.

<attr name="drawableLeftCompat" format="reference" /> 
    <attr name="drawableRightCompat" format="reference" /> 
    <attr name="drawableTopCompat" format="reference" /> 
    <attr name="drawableBottomCompat" format="reference" /> 

    <declare-styleable name="CustomTextView"> 
     <attr name="font" format="string" /> 
     <attr name="drawableLeftCompat" /> 
     <attr name="drawableRightCompat" /> 
     <attr name="drawableTopCompat" /> 
     <attr name="drawableBottomCompat" /> 
    </declare-styleable> 
+0

Warum? Ich habe es nur mit einfachen .png von (https://material.io/icons/#ic_check_circle), nicht Vektoren! Warum muss ich diese Methode implementieren, wenn die Grundfunktionalität nur 'drawableLeft' ist? –

+0

@Ruchir Banronia Wenn Ihr 'drawableLeft' kein Vektor _ ist (was bevorzugter und skalierbarer ist), müssen Sie keine benutzerdefinierte Textansicht erstellen, um auf die PNG-Datei zuzugreifen. Aber von Ihrem StackTrace zeigt es, dass Sie versuchen, Vektor-Drawble zu erreichen. –

+0

Deshalb bin ich so verwirrt. Ich verwende die .png-Datei von hier: https://material.io/icons/#ic_check_circle. Irgendwelche anderen Vorschläge? –