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:

  • Warum explizite Typ Argument sollte durch Diamant ersetzt werden?
  • Wie bekomme ich Android Checkbox auf der rechten Seite?
  • Android Fragment onCreateView vs. onActivityCreated
  • Android Repo init ist fehlgeschlagen
  • Android SlidingDrawer deaktiviert keine Schaltflächen unter der Schublade
  • Wie fügt Facebook hinzu, Badge-Nummern auf App-Symbol in Android?
  • <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.

  • Cordova Wrapper App Wo Interne Links Load In App, Externe Links Load In Browser
  • Ändere fillColor vom Vektor in android programmgesteuert
  • Wie man rechts nach links lineare Layout entwerfen
  • FragmentPagerAdapter getItem wird nicht aufgerufen
  • So deaktivieren Sie Android MediaPlayer Debug-Nachrichten
  • So ändern Sie den Aktivitätstitel in attach ()
  • 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.