appwidget内のプログレスバーの色を変化させるには?

1,524 views
Skip to first unread message

arasee

unread,
Jun 26, 2011, 9:01:13 PM6/26/11
to 日本Androidの会
初めて質問させていただきます。

シークバーやプログレスバーの色情報をレイアウトファイルに作成しておき、アクティビティ内で動的に変更したい場合、

sb = (SeekBar) findViewById(R.id.sb);
sb.setProgressDrawable(getResources().getDrawable(R.drawable.seekbar_gr));

とすれば実現できるのですが、これをappwidget内に配置したプログレスバーでやろうと思い、

RemoteViews remoteViews = new
RemoteViews(c.getPackageName(),R.layout.widget);
remoteViews.setInt(R.id.pb,"setProgressDrawable",getResources().getDrawable(R.drawable.seekbar_gr));

としたのですが、getResources()は未定義です。とエラーになってしまいます。
そもそもRemoteViews経由でDrawable属性を参照することは出来ないのでしょうか?

ユーザー設定にてappwidget内のプログレスバーの色を変更できるようにしたいのですが、
どなたか良いアイデアをお持ちでしたらご教授ください。よろしくお願いします。

ちなみに上記seekbar_gr.xmlの中身は以下の通りです。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/
android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ff666666"
android:centerColor="#ffaaaaaa"
android:centerY="0.3"
android:endColor="#ff444444"
android:angle="270" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ff118811"
android:centerColor="#ff11ff11"
android:centerY="0.3"
android:endColor="#ff116611"
android:angle="270"
/>
</shape>
</clip>
</item>
</layer-list>

大垣憲俊

unread,
Jun 29, 2011, 8:45:45 AM6/29/11
to android-g...@googlegroups.com
大垣です。

setImageViewResource (int viewId, int srcId) は使えないでしょうか。
以下の例を見つけました。

    static int index = 0;
    
    int[] images = {
        R.drawable.g0,
        R.drawable.g1,
        R.drawable.g2,
        R.drawable.g3,
        R.drawable.g4,
        R.drawable.g5,
        R.drawable.g6,
        R.drawable.g7,
    };
    
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.slide_show);
        remoteViews.setImageViewResource(R.id.ImageView01, images[index]);
        index = ++index % images.length;
        ComponentName thisWidget = new ComponentName(context, SlideShow.class);
        appWidgetManager.updateAppWidget(thisWidget, remoteViews);   
}


「Androidのホーム画面に常駐するアプリを作るには」
http://www.atmarkit.co.jp/fsmart/articles/android10/android10_3.html


suppi__

unread,
Jun 29, 2011, 1:45:20 PM6/29/11
to android-g...@googlegroups.com
こんばんは、suppi__です。

getResources()はContextのメソッドなので、c.getResources()と書いてみるのはどうでしょうか?

11/06/29 大垣憲俊 <noritos...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/Oj9iBgsw7SEJ
> にアクセスしてください。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。
>
>

arasee

unread,
Jun 30, 2011, 7:29:10 PM6/30/11
to 日本Androidの会
大垣様、初めまして。ご返答ありがとうございます。

早速試してみたのですが、結論から言うとダメでした。
コンパイルエラーこそ出ないものの、ウィジェットを配置しても「表示できません」的なメッセージが
ウィジェット内に出てしまいます。
やはりターゲットにしているのがプログレスバーなのでImageViewResourceを指定しても
受け付けてくれないみたいです。

arasee

unread,
Jun 30, 2011, 7:43:16 PM6/30/11
to 日本Androidの会
suppi様、初めまして。ご返答ありがとうございます。

早速やってみましたが今度は違うところでエラーになってしまいました。

remoteViews.setInt(R.id.pb,"setProgressDrawable",c.getResources().getDrawable
(R.drawable.seekbar_gr));
としましたら、今度はsetIntのところに赤い下線が出て、
「型 RemoteViews のメソッド setInt(int, String, int) は引数 (int, String,
Drawable) に適用できません」
というエラーです。

ならばと思い、
remoteViews.setInt(R.id.pb,"setProgressDrawable",R.drawable.seekbar_gr);
と直接Rを入れてやったらコンパイルエラーは出ないのですがウィジェットを配置すると真っ黒になってしまいました。

いっそのこと各色ごとにレイアウトファイルを作ってウィジェット配置時にユーザーに選ばせるってやり方
しかないですかね?
でも全部で7色用意する予定なのでウィジェット選択時に7つもあったらウザイと思われそうだし・・。


On 6月30日, 午前2:45, suppi__ <harmony.the...@gmail.com> wrote:
> こんばんは、suppi__です。
>
> getResources()はContextのメソッドなので、c.getResources()と書いてみるのはどうでしょうか?
>
> 11/06/29 大垣憲俊 <noritoshi.og...@gmail.com>:

yoshiyuki kanno

unread,
Jun 30, 2011, 7:57:41 PM6/30/11
to android-g...@googlegroups.com
菅野です。

すでにsuppi_様が回答している方法は試されましたか?

AppWidgetProviderのコールバックメソッドで渡されるContextを用いて

remoteViews.setInt(R.id.pb,"setProgressDrawable",context.getResources().getDrawable(R.drawable.seekbar_gr));
                                                                                          ^^^^^^^

とすれば問題なく参照できます。
Serviceでロジックを構築している場合は、Service自体がContextを継承しているので、
this.getResources()とすればOKです。

2011年7月1日8:29 arasee <ara.po...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。

yoshiyuki kanno

unread,
Jun 30, 2011, 8:51:53 PM6/30/11
to android-g...@googlegroups.com
おお。そうきましたか。
残念ながらDrawableな引数をとるリフレクションなメソッドは用意されていませんが、Bitmapを引数にとるそれは用意されているので
ちょっと面倒ですが、以下のような対応でどうでしょう。

1.ProgressBarを継承したCustomProgressBarを用意する。

2.CustomProgressBarに引数に「Bitmap」をとり、それをBitmapDrawableに変換して
     既存の「setProgressDrawable」に渡す「setProgressBitmap」メソッドを新規に作成する

3.remoViewsの呼び出しを
「remoteViews.setBitmap(R.id.pb,"setProgressBitmap",((BitmapDrawable)c.getResources().getDrawable).getBitmap())」に変更する

あまりエレガントではないですが、お試しください


2011年7月1日8:43 arasee <ara.po...@gmail.com>:

Yuki Anzai

unread,
Jun 30, 2011, 10:07:29 PM6/30/11
to android-g...@googlegroups.com
あんざいです。

 ブログに書きました。
 どうぞ。
 Drawable は Context に結びついているので、AppWidget に
 渡せないんですよー。

 Y.A.M の 雑記帳: AppWidget の ProgressBar の色を変える
 http://y-anz-m.blogspot.com/2011/07/appwidget-progressbar.html


2011/7/1 yoshiyuki kanno <neko...@gmail.com>:

--
あんざい ゆき
anzai...@gmail.com
twitter : @yanzm
Y.A.Mの雑記帳 http://y-anz-m.blogspot.com/

arasee

unread,
Jul 1, 2011, 2:49:15 AM7/1/11
to 日本Androidの会
suppi様

度々返信ありがとうございます。
せっかく良い案をいただいたのですが・・・
「10日でマスターするアンドロイド開発入門」って本しか読んだこと無い自分にはさっぱりで(T_T)
>1.ProgressBarを継承したCustomProgressBarを用意する。
の時点で(?_?;)となりました。
なんだか素人が踏み込む領域じゃ無いことをやろうとしてたのだと実感。

もうちょっと勉強して出直してきますm(__)m


On 7月1日, 午前9:51, yoshiyuki kanno <nekota...@gmail.com> wrote:
> おお。そうきましたか。
> 残念ながらDrawableな引数をとるリフレクションなメソッドは用意されていませんが、Bitmapを引数にとるそれは用意されているので
> ちょっと面倒ですが、以下のような対応でどうでしょう。
>
> 1.ProgressBarを継承したCustomProgressBarを用意する。
>
> 2.CustomProgressBarに引数に「Bitmap」をとり、それをBitmapDrawableに変換して
> 既存の「setProgressDrawable」に渡す「setProgressBitmap」メソッドを新規に作成する
>
> 3.remoViewsの呼び出しを
> 「remoteViews.setBitmap(R.id.pb,"setProgressBitmap",((BitmapDrawable)c.getRe sources().getDrawable).getBitmap())」に変更する
>
> あまりエレガントではないですが、お試しください
>
> 2011年7月1日8:43 arasee <ara.power...@gmail.com>:> suppi様、初めまして。ご返答ありがとうございます。

arasee

unread,
Jul 1, 2011, 3:21:15 AM7/1/11
to 日本Androidの会
あんざい様

おおおお!!\(◎o◎)/!
いつもY.A.Mの雑記帳 参考にさせていただいてます。
今回もブログに書いてないかなぁ?と過去記事は見ていたのですが、
まさかこんな形でブログに書いてくださるとは思いもしませんでした。

さっそく見させていただきましたがソースの解析するのにしばらく時間がかかりそうです(・・;
でも全部のソースを載せてくださってるのでなんとか自分のアプリに組み込みたいと思います。
ちょっと諦めモードだったのですが、自分がやろうとしてたことが不可能じゃないってわかっただけにやる気も出てきました☆

どうもありがとうございました!


On 7月1日, 午前11:07, Yuki Anzai <anzai.y...@gmail.com> wrote:
> あんざいです。
>
>  ブログに書きました。
>  どうぞ。
>  Drawable は Context に結びついているので、AppWidget に
>  渡せないんですよー。
>
>  Y.A.M の 雑記帳: AppWidget の ProgressBar の色を変える
>  http://y-anz-m.blogspot.com/2011/07/appwidget-progressbar.html
>
> 2011/7/1 yoshiyuki kanno <nekota...@gmail.com>:
>
> > おお。そうきましたか。
> > 残念ながらDrawableな引数をとるリフレクションなメソッドは用意されていませんが、Bitmapを引数にとるそれは用意されているので
> > ちょっと面倒ですが、以下のような対応でどうでしょう。
> > 1.ProgressBarを継承したCustomProgressBarを用意する。
> > 2.CustomProgressBarに引数に「Bitmap」をとり、それをBitmapDrawableに変換して
> > 既存の「setProgressDrawable」に渡す「setProgressBitmap」メソッドを新規に作成する
> > 3.remoViewsの呼び出しを
> > 「remoteViews.setBitmap(R.id.pb,"setProgressBitmap",((BitmapDrawable)c.getRe sources().getDrawable).getBitmap())」に変更する
> > あまりエレガントではないですが、お試しください
>
> > 2011年7月1日8:43 arasee <ara.power...@gmail.com>:
> anzai.y...@gmail.com
> twitter : @yanzm
> Y.A.Mの雑記帳http://y-anz-m.blogspot.com/
Reply all
Reply to author
Forward
0 new messages