2017-08-10 16 views
0

進捗状況とボタンを含むビューを作成したかったのです。ビューのxmlを通して、ボタンとポールバーのスタイルを定義するフィールドを追加したかったのです。スタイル可能な作業

私がこれまで行ってきたが、それは動作しません:

<io.**.**.view.ButtonLoading android:id="@+id/b_recover_password" 
             android:layout_width="wrap_content" 
             android:gravity="center" 
             app:styleButton="@style/ButtonGrey" 
             app:styleProgress="@style/ProgressBar" 
             app:textButton="@string/recover_password" 
             android:layout_height="wrap_content"/> 

はコード:

a = context.getTheme().obtainStyledAttributes(
      attrs, 
      R.styleable.ButtonLoading, 
      0, 0); 

    int buttonId = 0;// R.style.Widget_AppCompat_Button; 
    try { 
     buttonId = a.getResourceId(R.styleable.ButtonLoading_styleButton, 0); 
    } catch (Exception e) { 
    } 

    button = new Button(getContext(), attrs, buttonId); 

    LayoutParams lpButton = createLayoutParams(); 
    button.setLayoutParams(lpButton); 
    color = button.getCurrentTextColor(); 

    int progressId = 0;// R.style.Widget_AppCompat_ProgressBar; 
    try { 
     progressId = a.getResourceId(R.styleable.ButtonLoading_styleProgress, 0); 
    } catch (Exception e) { 
    } 

    progressBar = new ProgressBar(getContext(), attrs, progressId); 
    LayoutParams lpProgressBar = createLayoutParams(); 
    lpProgressBar.addRule(RelativeLayout.CENTER_IN_PARENT); 
    progressBar.setLayoutParams(lpProgressBar); 

    LayoutParams lpRelativeLayout = createLayoutParams(); 
    setLayoutParams(lpRelativeLayout); 

    addView(button); 
    addView(progressBar); 

    try { 
     String value = a.getString(R.styleable.ButtonLoading_textButton); 
     button.setText(value); 
    } catch (Exception e) { 
    } 
    a.recycle(); 

Styleable:

<declare-styleable name="ButtonLoading"> 
    <attr name="styleButton" format="reference" /> 
    <attr name="styleProgress" format="reference" /> 
    <attr name="textButton" format="string" /> 
</declare-styleable> 

誰かが私を助けて?おかげで

+0

"それはうまくいかない"と言うと、それはどういう意味ですか? – Cheticamp

+0

ボタンとプログレスバーのスタイルのセットが機能していません。デフォルトのスタイルに固執する。 –

+0

このコードはカスタム表示です。その方法の中でどのような方法ですか。基本(拡大)ビューとは何ですか?プログレスバーとボタンのスタイルを投稿できますか? – Cheticamp

答えて

1

ButtonProgressBarのコンストラクタに問題があります。 2つのコンストラクタを考えてみましょう。 (強調は私のものです。)(Documentation

ビュー(コンテキストコンテキスト、属性セットattrsに、int型defStyleAttr)[API 21以下のための適切な]

は、XMLからインフレを実行し、は、クラス固有の適用しますテーマ属性の基本スタイル。 Viewのこのコンストラクタでは、サブクラスが膨張しているときにサブクラスが独自の基本スタイルを使用できます。たとえば、Buttonクラスのコンストラクタは、このバージョンのスーパークラスコンストラクタを呼び出し、defStyleAttrにR.attr.buttonStyleを供給します。これにより、テーマのボタンスタイルで基本ビューのすべての属性(特に背景)とButtonクラスの属性を変更することができます。 [21+ APIのための適切な]

ビュー(コンテキストコンテキスト、属性セットattrsに、int型defStyleAttr、int型defStyleRes)

XMLからインフレを実行し、がテーマの属性やスタイルからクラス固有の基本スタイルを適用しますリソース。 Viewのこのコンストラクタでは、サブクラスが膨張しているときにサブクラスが独自の基本スタイルを使用できます。

最後の2つの引数に焦点を当てます。

defStyleAttr int:ビューのデフォルト値を提供するスタイルリソースへの参照を含む現在のテーマの属性。デフォルトを検索しない場合は0にすることができます。

defStyleRes int:defStyleAttrが0であるかテーマに見つからない場合にのみ使用されるビューのデフォルト値を提供するスタイルリソースのリソース識別子。デフォルトを検索しない場合は0にすることができます。

リソースIDがリソースIDを指しているので、混乱しますが、私には負担があります。

buttonIdおよびprogressIdに定義したものは、スタイル(<style...)を指すリソースIDです。このスタイルリソースIDは、上記のようにButtonおよびProgressBarコンストラクタのdefStyleRes属性に使用するのに適しています。これらのリソース値のそれぞれを、現在のテーマの属性を指すIDとして使用しようとしています。言い換えれば、R.attr.styleButton(styleButton)は、現在定義されているテーマではない現在のテーマの属性です。あなたは彼らのようにスタイルやレイアウトファイルを残す残すことができ21+ APIとの仕事を持っているものを作るために

のstyles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="styleButton">@style/ButtonGrey</item> 
    ... 
</style>   

:この問題を解決するには、次のようにテーマスタイルを変更カスタムビューコードを次のように変更します。 (ボタンのコードのみを表示していますが、プログレスバーは似ています)。API 21+(styles-v21.xml)用の別のスタイルファイルを作成することができます。

public CustomViewGroup(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    TypedArray a = context.getTheme().obtainStyledAttributes(
      attrs, 
      R.styleable.ButtonLoading, 
      0, 0); 
    int defStyleRes = 0; 
    try { 
     defStyleRes = a.getResourceId(R.styleable.ButtonLoading_styleButton, 0); 
    } catch (Exception e) { 
     // do something 
    } 
    Button button; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     // defStyleRes is only used if defStyleAttr == 0 
     // or can't be found in the current theme. 
     button = new Button(getContext(), attrs, defStyleAttr, defStyleRes); 
    } else { 
     button = new Button(getContext(), attrs, 
        (defStyleAttr != 0) ? defStyleAttr : R.attr.styleButton); 
    } 
    try { 
     String value = a.getString(R.styleable.ButtonLoading_textButton); 
     button.setText(value); 
    } catch (Exception e) { 
     // do something 
    } 
    addView(button); 
    a.recycle(); 
} 

ボタンのテキストを設定すると、コード化されたとおりに進行します。スタイルはよりトリッキーです。 app:styleButton="@style/ButtonGrey"をすべてのAPIで意図したとおりに動作させるには、thisのような処理が必要になると思います。

こちらがお役に立てば幸いです。

0

私のスタイルは、次のとおりです。

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="android:buttonStyle">@style/ButtonAppTheme</item> 
    <item name="android:progressBarStyle">@style/ProgressBarBase</item> 
</style> 

<style name="ProgressBarBase" parent="android:Widget.Holo.Light.ProgressBar"> 
    <item name="android:textColorTertiary">@color/color_grey</item> 
</style> 

<style name="ProgressBar" parent="android:Widget.Holo.Light.ProgressBar"> 
    <item name="android:textColorTertiary">@color/color_black</item> 
</style> 

問題は、あなたが常に「ProgressBarBase」のスタイルを持っているということです。つまり、上書きされません。

関連する問題