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:

  • Android Popup-Menü Textfarbe (AppCompat)
  • Android: wie man getApplication und getApplicationContext von non activity / service class verwendet
  • Phonegap Hinzufügen von Elementen zum Benachrichtigungstablett
  • Wie kompiliere ich Gabelung in Gradle?
  • Android TextView nicht in CoordinatorLayout auswählbar? (TextView unterstützt keine Textauswahl) Auswahl abgebrochen)
  • Erhalten des Pixel-Farbwertes eines Punktes auf einer Android-Ansicht, die eine Bitmap-unterstützte Leinwand enthält
  • <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.

  • Wie verwende ich adb grant oder adb?
  • Skalengrenzen für Pinch Zoom von Android
  • Midi Library für Android
  • Android - immer einen Fehler "keine Anwendung kann diese Aktion ausführen" beim Versuch, eine E-Mail zu senden?
  • Hinzufügen / Entfernen von Kopf- und Fußzeilen dynamisch
  • Android java.lang.IllegalStateException: Die Methode der Aktivität konnte nicht ausgeführt werden
  • 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.