Wie man benutzerdefinierte Dimension Attribut aus Java-Code zu lesen

Ich habe meine benutzerdefinierte Komponente nur setzen einige TextViews zusammen. Jetzt möchte ich in der Lage sein, meine benutzerdefinierte Steuerung direkt aus dem Code zu initiieren, indem ich Textgrößen unabhängig für jeden von TV's übergeben kann

Meine Attribute Definition:

<resources> <declare-styleable name="BasicGauge"> <attr name="valueTextSize" format="dimension" /> <attr name="titleTextSize" format="dimension" /> <attr name="unitsTextSize" format="dimension" /> </declare-styleable> </resources> 

Probeninitialisierung der Komponente:

 <pl.com.digita.BikeComputerUi.customviews.BasicGauge android:id="@+id/basicGauge1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:padding="10dp" valueTextSize="40sp"> </pl.com.digita.BikeComputerUi.customviews.BasicGauge> 

Wie versuche ich, diese Attribute im Komponenten-Konstruktor zu lesen:

 final int N = typedArray.getIndexCount(); for (int i = 0; i < N; i++) { int attribute = typedArray.getIndex(i); switch (attribute) { case R.styleable.BasicGauge_valueTextSize: valueTextSize = typedArray.getString(attribute); break; case R.styleable.BasicGauge_titleTextSize: titleTextSize = typedArray.getString(attribute); break; case R.styleable.BasicGauge_unitsTextSize: unitsTextSize = typedArray.getString(attribute); break; } typedArray.recycle(); } 

Problem: Nach der Schaffung sind alle meine Werte immer noch null. 40sp ist genau mein gewünschter Wert.

  • Android ziehbare xml Kann nicht in Farbe umwandeln Ausnahme für API 10
  • Robolectric wirft Ressourcen $ NotFoundException beim Versuch, auf Ressource im Rohordner zuzugreifen
  • Android: Warum bekommt getDimension und getDimensionPixelSize beide gleich?
  • Einstellen von TextView-Farbe auf einen <selector> programmgesteuert
  • Wie bekomme ich die Ressourcen-ID eines Bildes, wenn ich seinen Namen kenne?
  • "R kann nicht auf eine Variable aufgelöst werden"?
  • Programmieren Sie den Wert einer Farbresource, die aus der API-Antwort erhalten wurde, programmgesteuert
  • Holen Sie sich Farbwert programmgesteuert, wenn es eine Referenz (Thema)
  • 2 Solutions collect form web for “Wie man benutzerdefinierte Dimension Attribut aus Java-Code zu lesen”

    Ein paar Dinge zu sagen:

    • Zuerst brauchst du eine xml-Namensraum-Deklarationszeile an der Oberseite deines xml, genau so wie du mit androiden xmlns machst: xmlns: foo = "http://schemas.android.com/apk/res-auto&quot;
    • Dann musst du valueTextSize mit deinem xmlns voranstellen: foo: valueTextSize = "40sp"

    Danach ist es nicht eine sehr gute Idee, einen String zu bekommen, android bietet eine leistungsfähigere Lösung, um mit Dimensionen umzugehen:

     int unitsTextSize = typedArray.getDimensionPixelSize(R.styleable.BasicGauge_unitsTextSize, textSize); 

    Dann gibt es einige subtilities:

    • Für eine farbe oder ein textpaint, kannst du diesen wert wie: paint.setTextSize(unitTextSize):
    • Für eine Textansicht würde der obige Ansatz fehlschlagen, und Sie müssen eine Überladung von setText verwenden, um das richtige Ergebnis zu erhalten: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, unitTextSize);

    Der Unterschied kommt von dem, was heißt "rohe Pixel" (unscaled nach Dichte, nur roh) und "skalierte Pixel" (das Gegenteil).

    Für ein wenig mehr Kontext zur akzeptierten Antwort:

    Attrs.xml

    Setzen Sie das benutzerdefinierte Attribut mit dem dimension .

     <resources> <declare-styleable name="CustomView"> <attr name="valueTextSize" format="dimension" /> <attr name="titleTextSize" format="dimension" /> <attr name="unitsTextSize" format="dimension" /> </declare-styleable> </resources> 

    Activity.xml

    Verweise deine Attribute mit xmlns:app=... und setze sie in dein xml mit app:...

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.myproject.CustomView android:layout_width="wrap_content" android:layout_height="wrap_content" app:valueTextSize="40sp" app:titleTextSize="20sp" app:unitsTextSize="24sp" /> </RelativeLayout> 

    CustomView.java

    Erhalte die Werte aus dem TypedArray mit getDimensionPixelSize . Innerhalb deiner benutzerdefinierten Ansicht arbeitest du nur mit Pixeln. Sehen Sie diese Antwort, wenn Sie in eine andere Dimension umwandeln müssen.

     public class CustomView extends View { private float mValueTextSize; // pixels private float mTitleTextSize; // pixels private float mUnitsTextSize; // pixels public CustomView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.CustomView, 0, 0); try { mValueTextSize = a.getDimensionPixelSize(R.styleable.CustomView_valueTextSize, 0); mTitleTextSize = a.getDimensionPixelSize(R.styleable.CustomView_titleTextSize, 0); mUnitsTextSize = a.getDimensionPixelSize(R.styleable.CustomView_unitsTextSize, 0); } finally { a.recycle(); } } // ... } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.