以编程方式创建小部件

Posted

技术标签:

【中文标题】以编程方式创建小部件【英文标题】:Create widget programmatically 【发布时间】:2013-10-07 14:33:46 【问题描述】:

据我了解,android 小部件需要 RemoteViews,而不是 View,就像活动一样。

我的问题:有什么办法可以完全避免xml,用java代码构建整个布局?

替代问题:我可以像使用findViewById(int) 一样检索视图吗?例如:LinearLayout linearLayout=(LinearLayout)findViewById(R.id.xxx); 这样我就可以访问基本布局,并随心所欲地进行操作。

谢谢!

【问题讨论】:

您可以使用remoteViews.addView(viewId, nestedView)添加您的自定义视图 我在看那个,可能这就是我必须使用的.. 它会帮助你。developer.android.com/reference/android/widget/… 【参考方案1】:

有什么办法可以完全避免xml,用java代码构建整个布局?

不,对不起。 RemoteViews 严重依赖布局 XML 资源。虽然有一个 addView() 方法,但它转身并添加另一个 RemoteViews,这会让您回到起点。

我可以像使用 findViewById(int) 一样检索视图吗?

不,因为您的进程中没有View。您可以通过 RemoteViews 上的各种 setter 方法配置小部件。

【讨论】:

所以如果我理解正确,RemoteViews 是在 AppWidget 上下文中View 的一种“替代品”?我看到我可以使用setTextViewText(int, CharSequence) 来设置显示的文本,但是我可以检索它吗,比如getTextViewText()?不幸的是,没有这样的方法。对不起,如果问题是微不足道的或蹩脚的,我几个小时前才开始学习。 :) @hundeva:“RemoteViews 是 AppWidget 上下文中 View 的一种“替代品”?” -- 它是一组序列化的命令,供另一个进程为应用小部件定义Views。 “但我可以像 getTextViewText() 那样检索它吗?” - 不。应用小部件 API 是只写的。 @CommonsWare 知道this app 是如何做到不可能的事情的吗? @Pedram:据推测,他们正在创建和显示位图,或者使用addViews() 从一系列较小的布局中组合应用小部件。其中任何一个似乎都适合该应用程序提供的功能,我敢打赌,鉴于他们描述的功能集,他们将使用位图路线。如果您在这方面还有其他顾虑,请提出单独的 Stack Overflow 问题。【参考方案2】:

您可以像LinearLayout mLinearLayout = new LinearLayout(this);

一样务实地采用线性布局

你也可以使用

添加它的寒冷
Button mButton = new Button(this);   

mLinearLayout.addView(mButton);

setContentView(mLinearLayout);

【讨论】:

这适用于任何 Activity,但是,在使用 AppWidgetProvider 时不能这样做

以上是关于以编程方式创建小部件的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 以编程方式创建今日小部件扩展

Dojo vs JQuery 编程小部件创建

以编程方式更改应用小部件背景颜色

如何以编程方式在 Flutter 中用 Empty Container() 小部件替换 Text() 小部件?

Android:以编程方式启用/禁用应用小部件

以编程方式在 ViewPager 项目小部件和包含 ViewPager 的布局小部件之间设置约束是不可能的