看起来像我的#$#%$%#$接收器不是清单中的应用程序元素
你好
我刚刚创建了helloworld appwidget以了解它的工作原理.我在adroid开发站点上关注了dev示例.但由于某种原因,小部件不希望在小部件列表中显示.
AndroidManifest.xml中
<receiver android:name="VoiceRIAWidget" android:label="Voice RIA">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_info" />
</receiver>
Run Code Online (Sandbox Code Playgroud)
appwidget_info.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:label="Voice RIA" android:minWidth="50dp" android:minHeight="50dp"
android:updatePeriodMillis="86400000" android:initialLayout="@layout/appwidget">
</appwidget-provider>
Run Code Online (Sandbox Code Playgroud)
VoiceRIAWidget
public class VoiceRIAWidget extends AppWidgetProvider
{
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds)
{
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++)
{
int appWidgetId = appWidgetIds[i];
CharSequence text = "Hello";
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.appwidget);
views.setTextViewText(R.id.appwidget_text, text); …Run Code Online (Sandbox Code Playgroud) 我正在开发一个AppWidget我需要一个TextView显示文本作为选框的地方.我已经尝试使用以下代码(正如常规中所做的那样Activity),但文本不会滚动.
<TextView
android:layout_width="150dip"
android:layout_height="wrap_content"
android:text="@string/marquee_forever"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever" />
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何解决这个问题?
我有一个包含StackView的AppWidget.与AppWidget一起,我有一个服务,当用户将我的AppWidget添加到他们的主屏幕时每两小时轮询一次新数据时启动该服务.当服务找到新数据时,我需要它提醒我的AppWidget,并将该数据传递给RemoteViewsService(具有我的RemoteViewsFactory),以便它可以为新数据创建必要的视图.
目前,当服务找到新数据时,我向AppWidget广播已发现新数据,将该数据作为意图内的整数数组传递.
我的AppWidgetProvider中的onReceive方法将该数据拉出来,然后我将完成设置一个新的intent的过程,该intent将传递给我的RemoteViews for AppWidget.示例代码如下:
public void onReceive( Context context, Intent intent )
{
int[] appWidgetIds = appWidgetManager.getAppWidgetIds( new ComponentName( context, SampleAppWidgetProvider.class ) );
int[] sampleData = intent.getIntArrayExtra( Intent.EXTRA_TITLE );
for ( int i = 0; i < appWidgetIds.length; i++ )
{
// RemoteViewsFactory service intent
Intent remoteViewsFactoryIntent = new Intent( context, SampleAppWidgetService.class );
remoteViewsFactoryIntent.putExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i] );
remoteViewsFactoryIntent.setData( Uri.parse( remoteViewsFactoryIntent.toUri( Intent.URI_INTENT_SCHEME ) ) );
remoteViewsFactoryIntent.putExtra( Intent.EXTRA_TITLE, sampleData );
RemoteViews rv = new RemoteViews( context.getPackageName(), R.layout.widget_layout );
// Sync up …Run Code Online (Sandbox Code Playgroud) android android-widget android-service stackview android-appwidget
更新:我打开了一个问题,如果您遇到同样的问题,请为其加注. http://code.google.com/p/android/issues/detail?id=28016
我有一个带有gridview的appwidget.
当我开始向我的小部件添加项目时,几乎总是我得到两次显示的第一个项目(而不是显示第一个项目和第二个项目).
如果我做一个小部件更新意图,那么问题是固定的,永远不会返回(假设我的gridview上已经有两个项目).
但总是在添加前两个项目时发生.
任何想法可能是什么?
更新:我刚刚注意到,当一个新项目添加到GridView时,它总会发生.如果我在不添加新项目的情况下刷新小部件,那么它可以正常工作.
我看到的另一件事是getViewAt方法总是为第一个项目(位置零)调用两次.也许它有关系?
我非常密切地关注这里的示例:http: //developer.android.com/resources/samples/WeatherListWidget/src/com/example/android/weatherlistwidget/WeatherWidgetService.html
这是我的RemoteViewsService,我认为这是相关的部分,但我不确定.还有什么可以影响它?
package com.manor.TestApp;
public class TestAppRemoteViewsService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new TestAppViewsFactory(this.getApplicationContext(), intent);
}
}
class TestAppViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private Context mContext;
//private int mAppWidgetId;
private TestDb mDb = null;
private int mCount = 0;
private String[] mData;
public TestAppViewsFactory(Context context, Intent intent) {
mContext = context;
/*mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);*/
}
@Override
public void onCreate() {
mDb …Run Code Online (Sandbox Code Playgroud) 我已经对Android编程了一段时间,但这真让我感到困惑.
所以我有一个简单的appwidget和textview.我只是希望文本视图中的文本字体大小在用户调整小部件大小时向上/向下扩展,以便在调整应用程序大小时使文本更大.我尝试了几种解决方案但一切都失败了:
简单地使用"sp"(缩放像素)单位作为字体大小 - 当窗口小部件大小改变时,这不会缩放文本(我也没想到它!).
使用我自己的和扩展的onSizeChanged方法扩展TextView.但是你不能在一个小部件中拥有基本UI类的后代(文档也说明了这一点).
由于没有方法可以获得当前的appWidget大小,我只是被困在这里.
是的,我知道一个解决方案是创建不同版本的小部件,如1x4和2x4等,但肯定还有另一种方法吗?
欢迎任何想法?
我的应用程序在服务中更新,并首先执行此操作以获取小部件的ID:
AppWidgetManager widgetManager = AppWidgetManager.getInstance(this);
int[] widgetIds = widgetManager.getAppWidgetIds(new ComponentName(this, WidgetReceiver.class));
Run Code Online (Sandbox Code Playgroud)
有时,即使窗口小部件仍在主屏幕上,此方法也将返回一个空数组.我四处搜索,找不到任何相关信息.问题是它并不总是发生,只是有时候(尽管一旦看起来它在后续的更新尝试中不会成功的话就会发生).
有没有人碰到这个,更好的是找到了解决方案?非常感激.
我是android开发的新手。我正在尝试为我的应用程序制作一个小部件,其中将包含一个列表视图,每个列表视图除了标题和内容外还具有2个按钮。
我试图在按下该元素的按钮时(在主屏幕上)隐藏应用程序小部件中listitem的相应元素。
首先,我尝试检查按钮单击是否获得了任何响应,以及是否可以检测到是否可以找到项目的位置。所以我这样做:
listprovider.java(实现remoteviewfactory):
@Override
public RemoteViews getViewAt(int position) {
final RemoteViews remoteView = new RemoteViews(
context.getPackageName(), R.layout.list_row);
ListItem listItem = listItemList.get(position);
remoteView.setTextViewText(R.id.heading, listItem.heading);
remoteView.setTextViewText(R.id.content, listItem.content);
Bundle extras = new Bundle();
extras.putInt(WidgetProvider.EXTRA_ITEM, position);
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
// Make it possible to distinguish the individual on-click
// action of a given item
remoteView.setOnClickFillInIntent(R.id.buttonwidget, fillInIntent);
return remoteView;
}
Run Code Online (Sandbox Code Playgroud)
然后在WidgetProvider.java中(扩展了AppWidgetProvider):
for (int i = 0; i < N; ++i) {
RemoteViews remoteViews = updateWidgetListView(context,
appWidgetIds[i]);
Intent clickIntent …Run Code Online (Sandbox Code Playgroud) 我在我的开发AppWidget根据Android的文档,装我的光标onCreate(),并在重新加载它onDataSetChanged(),一切工作正常,直到我把我的一些断点RemoteViewsService.RemoteViewsFactory,并惊奇地发现,onDataSetChanged()是始终调用后调用onCreate(),这使我的光标装载两次,当第一创建.我在Android 4.4.3上.
根据Api doc,
public abstract void onDataSetChanged()
在API级别11中添加
在远程适配器上触发notifyDataSetChanged()时调用.这允许RemoteViewsFactory通过更新任何内部引用来响应数据更改.注意:在此方法中可以安全地同步执行昂贵的任务.在此期间,旧数据将显示在窗口小部件中.
似乎只能通过自己手动调用notifyDataSetChanged()来触发此调用.
但是根据Appwidget指南,
在onCreate()中,您可以为数据源设置任何连接/光标.繁重的工作,例如下载或创建内容等,应该推迟到onDataSetChanged()或getViewAt().在此呼叫中花费超过20秒将导致ANR.
通过说延期,是否暗示onDataSetChanged()将被称为后onCreate()?我不太确定......但它确实说我应该把光标放在里面onCreate().
我自己尝试调查此问题,但是可用的源代码正在使用,Binder因此远程调用者仍然未知,因此我无法检查其来源.
你有什么主意吗?
我有几个非常相似的布局AppWidget,实际上只有一个TextView元素的旋转不同(我根据屏幕方向选择合适的布局).
所以,不要多次重复相同的东西(我讨厌重复),我想我会通过重新使用布局来<include/>尝试整理一些东西.
当我试图通过ID引用布局的特定元素时,问题出现了.如果元素在包含的布局xml中,对于非 -AppWidget布局,我使用了这里描述的方法,其中使用了两层方法...
在"父"布局中:
<include layout="@layout/my_layout" android:id="@+id/textview_layout" />
Run Code Online (Sandbox Code Playgroud)
在代码中:
TextView tv = (TextView)findViewById(R.id.textview_layout).findViewById(R.id.textview);
tv.setText("test");
Run Code Online (Sandbox Code Playgroud)
... TextView"子"布局中的ID的位置textview.所以这是一个两阶段的方法,你首先引用View包含TextView你想要的东西,然后引用TextView它.
但是对于AppWidgets而言,不是直接与之交易,而是TextView必须通过一切来做RemoteViews.
所以代替:
TextView textView = (TextView)findViewById(viewId);
textView.setText("text");
Run Code Online (Sandbox Code Playgroud)
你必须这样做:
remoteViews.setTextViewText(viewId, "text");
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
Run Code Online (Sandbox Code Playgroud)
鉴于进入的接口RemoteViews是通过传递单个(直接)视图ID,您将如何引用包含文件中的元素?
这件事让我抓狂.这是它的工作原理
1.一切都设为默认值
2.添加到小部件布局的白色背景
主要小部件布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:background="@android:color/white" -- this line only applies for case 2
android:padding="@dimen/widget_padding">
<TextView
...
android:background="@color/primary"
android:textColor="@android:color/white"/>
<ListView
...
android:drawSelectorOnTop="true""/>
<TextView
...
android:textColor="?android:attr/textColorSecondary"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
列表项目布局
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
...
android:id="@+id/widgetItem">
<TextView
...
android:textColor="@android:color/black"
android:textSize="14sp"/>
<TextView
...
android:textColor="@color/negative_amount"
android:textSize="16sp"
android:textStyle="bold"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
我花了一天时间尝试所有可能的组合,但没有任何帮助.并且我没有得到这样的事实:列表视图周围的某些布局的无关背景更改完全改变了行为.WTF?
我想以最干净的方式解决它 - 没有自定义选择器的黑客攻击.如果可能的话,这应该直接开箱即用.