以编程方式更改小部件布局

9
假设我有两个小部件布局:Layout1和Layout2。小部件的默认布局是Layout1,但我允许用户选择他们想要的布局。那么如果用户更改为Layout2,我如何以编程方式将布局更改为Layout2?
对于小部件,就像Activity一样,没有setContentView方法。
谢谢
2个回答

9

在构建您的remoteView时,您需要选择布局。在我的小部件代码中:

public static RemoteViews buildUpdate(Context context, String action) {
    RemoteViews updateViews;            
    SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
    String typeface = prefs.getString("typeface", "sans");
    int layoutId = R.layout.widget_sans;
    if ("monospace".equals(typeface)){
        layoutId = R.layout.widget_mono;
    } else if ("serif".equals(typeface)){
        layoutId = R.layout.widget_serif;
    }
    updateViews = new RemoteViews(context.getPackageName(),
        layoutId);
    //actually do things here
    //then finally, return our remoteView
    AppWidgetManager.getInstance(context).updateAppWidget(
        new ComponentName(context, FuzzyWidget.class), updateViews);

}

那么我需要的是layoutID吗?我注意到updateAppWidget方法没有使用它。 - Ryan Alford
抱歉 - 我错过了一行;已经修复。你需要做的是使用包名和布局ID创建一个新的RemoteViews,然后将其传递给updateAppWidget函数。 - Yoni Samlan

2

谢谢Yoni。

我想要添加一些代码。获取RemoteViews对象时,您需要指定上下文和布局ID。这是设置要显示的布局的地方。

例如...

 RemoteViews views = null;

 if (1 == 1)
       views = new RemoteViews(m_context.getPackageName(), R.layout.Layout1);
 else 
       views = new RemoteViews(m_context.getPackageName(), R.layout.Layout2);

 AppWidgetManager.getInstance(context).updateAppWidget(
    new ComponentName(context, FuzzyWidget.class), views);

2
抱歉,我在从代码中复制时不小心删除了几行。已经修复了。 - Yoni Samlan
@YoniSamlan 我成功更改了布局,但在更改布局后,小部件的点击功能无法正常工作... - Prashant09
@Prashant09 使用 switch case。 - Ranjit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接