[解決済み] 方法 カスタムウィジェットのテーマ(スタイル)項目を定義する
質問
アプリケーション全体で広く使用されているコントロールのカスタムウィジェットを書きました。 ウィジェットクラスは
ImageButton
から派生し、いくつかの簡単な方法でそれを拡張しています。ウィジェットが使用されるときに適用できるスタイルを定義しましたが、テーマを通じてこれを設定することを希望します。 で
R.styleable
のようなウィジェットスタイル属性があります。
imageButtonStyle
と
textViewStyle
. 私が書いたカスタムウィジェットのためにそのようなものを作成する方法はありますか?
どのように解決するのですか?
はい、ひとつだけ方法があります。
ウィジェットの属性の宣言があるとします (
attrs.xml
):
<declare-styleable name="CustomImageButton">
<attr name="customAttr" format="string"/>
</declare-styleable>
スタイル参照に使用する属性を宣言する(
attrs.xml
):
<declare-styleable name="CustomTheme">
<attr name="customImageButtonStyle" format="reference"/>
</declare-styleable>
ウィジェットのデフォルトの属性値のセットを宣言します (
styles.xml
):
<style name="Widget.ImageButton.Custom" parent="android:style/Widget.ImageButton">
<item name="customAttr">some value</item>
</style>
カスタムテーマを宣言する (
themes.xml
):
<style name="Theme.Custom" parent="@android:style/Theme">
<item name="customImageButtonStyle">@style/Widget.ImageButton.Custom</item>
</style>
この属性は、ウィジェットのコンストラクタの 3 番目の引数として使用します (
CustomImageButton.java
):
public class CustomImageButton extends ImageButton {
private String customAttr;
public CustomImageButton( Context context ) {
this( context, null );
}
public CustomImageButton( Context context, AttributeSet attrs ) {
this( context, attrs, R.attr.customImageButtonStyle );
}
public CustomImageButton( Context context, AttributeSet attrs,
int defStyle ) {
super( context, attrs, defStyle );
final TypedArray array = context.obtainStyledAttributes( attrs,
R.styleable.CustomImageButton, defStyle,
R.style.Widget_ImageButton_Custom ); // see below
this.customAttr =
array.getString( R.styleable.CustomImageButton_customAttr, "" );
array.recycle();
}
}
ここで
Theme.Custom
を使う全てのアクティビティに
CustomImageButton
を使用するすべてのアクティビティに適用します (AndroidManifest.xml内)。
<activity android:name=".MyActivity" android:theme="@style/Theme.Custom"/>
以上です。では
CustomImageButton
からデフォルトの属性値を読み込もうとします。
customImageButtonStyle
属性から読み込もうとします。テーマ内にそのような属性がない場合、あるいは属性の値が
@null
である場合、最後の引数は
obtainStyledAttributes
が使われることになります。
Widget.ImageButton.Custom
となります。
すべてのインスタンスとすべてのファイル(ただし
AndroidManifest.xml
を除く)、Androidの命名規則を使用するのがよいでしょう。
関連
-
[解決済み] 既存のカスタムテーマでXMLのアクティビティのタイトルバーを非表示にする方法
-
[解決済み】AppCompat用全画面テーマ
-
[解決済み] ArrayAdapter<myClass> の使用方法
-
[解決済み] Android Studio - あいまいなメソッド呼び出し getClass()
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] Android Studioの「未実装メソッドの追加」機能
-
[解決済み] AndroidでTextViewの下にアンダーラインを引くには
-
[解決済み] フラグメント間の値の受け渡し方法
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] Google Play ストア内部テストのロールアウトが開始できない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Eclipseでのandroid:configChangesでのAdmobエラー
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] google-services.jsonって実際何してるの?
-
[解決済み] Android APKファイルの中身を見るには?
-
[解決済み] LayoutParamsの高さを密度に依存しないピクセル数でプログラム的に設定する。
-
[解決済み] ViewPager2でスワイプを無効にするには?
-
[解決済み] Travis.yml ./gradlew : パーミッションが拒否されました。
-
[解決済み] 実行に失敗しました app:processDebugResources Android Studio