如何编辑/更改从RemoteView中的布局查看或从View创建RemoteView?

hon*_*989 8 java android widget

我为Android应用程序创建小部件(当然是Java).我有从布局创建的经典RemoteViews(使用布局ID)

RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.view);
Run Code Online (Sandbox Code Playgroud)

我需要编辑或更改视图(通过id识别).在经典View中使用findViewById函数很容易.

View v = ... //inflate layout R.layout.view
View my = v.findViewById(R.id.myViewId);
processView(my); //filling view
Run Code Online (Sandbox Code Playgroud)

但是RemoteViews不支持它.可以使用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);
Run Code Online (Sandbox Code Playgroud)

其次,更糟糕的选择是获取我所需的视图表单RemoteViews,处理它,删除旧视图并使用addView()添加已处理的新视图.

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

但我不知道如何从View创建RemoteViews(有可能吗?).任何想法如何解决这个问题?

Ang*_*oid 6

试试这个方法:

        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);
Run Code Online (Sandbox Code Playgroud)

这是了解小部件行为的有用帖子:

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

  • 谢谢你的回答。这个方法(和其他 set*)用于设置我知道的 RemoteViews 对象的属性。问题是,我必须知道所有 ID 并分别设置它们(在小部件和布局中) - 有可能,但并不好!例如:现在我有一个具有定义结构的布局。当我想要填充它们时,我将他放入演示者方法 (present(View v)) 中,这就是全部!可能的解决方案可能是在布局中设置 ID 并使用反射来迭代和处理它们。如果没有更好的选择![我希望这是可以理解的。] (4认同)

hon*_*989 1

因为从删除视图编辑/更改(子)视图或从视图创建远程视图可能是不可能的(根据我建立的基本信息),我使用命名必要的视图(最常见的是文本视图)解决了我的问题,使用他的名字和反射获取视图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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式可以处理大量视图并为它们应用远程视图功能。