2013-11-09 5 views
7

私はAndroidアプリケーション用のウィジェットを作成します(Javaではもちろん)。レイアウトから作成した古典的なRemoteViewを持っています(レイアウトIDを使用)どのように編集/変更するのですか?RemoteViewのレイアウトから見るか、ViewからRemoteViewを作成しますか?

RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.view); 

私は編集やビューの変更(idで識別)が必要です。古典的なビューでは、findViewById関数を使用すると簡単です。

View v = ... //inflate layout R.layout.view 
View my = v.findViewById(R.id.myViewId); 
processView(my); //filling view 

ただし、RemoteViewではサポートされていません。 apply()を使用してビューを取得することは可能ですが、processViewとreapply()の後では変更が表示されません。

View v = rv.apply(context, null); 
View my = v.findViewById(R.id.myViewId); 
processView(my); //this work's fine 
rv.reapply(context,my); 

第二に、より悪いオプション、)古いビューを削除し、addViewを(使用して処理新しいビューを追加し、それを処理、私の必要なビューフォームRemoteViewsを取得することです。

RemoteViews rv = ... 
View my = ... //apply, find and process 
//remove old view 
RemoteViews rvMy = ... //create RemoteViews from View 
rv.addView(rvMy) 

しかし、ViewからRemoteViewを作成する方法はわかりません(可能ですか?)。どのようにこの問題を解決する任意のアイデアですか?ここで

 RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.widget); 

     remoteViews.setTextViewText(R.id.widget_textview, text); <---- here you can set text 

     // Tell the widget manager 
     appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 

は、ウィジェットの動作を理解するのに便利なポストである:

+0

あなたの質問には少しの説明が必要だと思います。 IDを知らずにRemoteViewsビューのテキストを変更しようとしていますか? –

答えて

1

ビューからremoveviewまたは作成remoteviewから編集/変更(サブ)ビューがあるので私は自分の問題を解決しました必要なビュー(ほとんどのテキストビュー)、彼の名前と反射とprocを使用してIDを取得するサイクルでのエッセンス。名前を付けるために、bash、pythonなどを使用することができます。

例:

RemoteView rv = ... 

/* 
exemplary rv layout: 
+-----+-----+-----+-----+-----+-----+ 
|tv0x0|tv0x1|tv0x2|tv0x3|tv0x4|tv0x5| 
+-----+-----+-----+-----+-----+-----+ 
|tv1x0|tv1x1|tv1x2|tv1x3|tv1x4|tv1x5| 
+-----+-----+-----+-----+-----+-----+ 
*/ 

String prefix = "tv"; 
for(int i=0; i<2;i++) 
{ 
    for(int j=0; j<6; j++) 
    { 
     // use reflection, searched in stackoverflow 
     int id = getItemIdFromName(prefix+i+"x"+j); 
     // working with concrete id using RemoteView set functions, e.g 
     rv.setTextViewText(id, String.ValueOf(i); 
    } 
} 

この方法では、多数のビュー可能なプロセスであり、彼らのためにremoteview関数を適用します。

3

この方法を試してみてください

http://www.vogella.com/articles/AndroidWidgets/article.html

+4

お返事ありがとうございます。私が知っているRemoteViewsオブジェクトのプロパティを設定するこのメソッド(と他のセット*)。問題は、私がすべてのIDを知っていて、それぞれを別々に(ウィジェットとレイアウトで)設定しなければならないということです - それは可能ですが、良くありません!例えば:今私は定義された構造を持つレイアウトを持っています。私はそれらを満たしたいとき、私は彼をプレゼンターの方法(現在(ビューv))に入れ、それだけです!考えられる解決法は、レイアウトにIDを設定し、リフレクションを使用して反復処理して処理する可能性があります。良いオプションでない場合! [これは分かりやすいと思う] – honzakuzel1989

関連する問題