关于androidappwidgetlistview没有更新和android.widget.listview的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AndroidAppwidget
关于android appwidget listview没有更新和android.widget.listview的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Appwidget textview不更新、Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView、Android Widget 中ListView加载网络图片、android – AppWidget alarmmanager没有更新等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- android appwidget listview没有更新(android.widget.listview)
- Android Appwidget textview不更新
- Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView
- Android Widget 中ListView加载网络图片
- android – AppWidget alarmmanager没有更新
android appwidget listview没有更新(android.widget.listview)
Intent update = new Intent(context,MenuWidgetProvider.class); update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,appWidgetIds); PendingIntent pIUpdate = PendingIntent.getbroadcast(context,update,0); ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)). set(AlarmManager.RTC,nextTime.toMillis(false),pIUpdate); Log.d(TAG,"updating: " + dmt.mealName); for (int i = 0; i < appWidgetIds.length; ++i) { int widgetId = appWidgetIds[i]; RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget_menu); // meal name views.setTextViewText(R.id.widget_locname,prefs.getString(PREF_WIDGET_LOCNAME,"")); // adapter Intent adapter = new Intent(context,MenuWidgetAdapterService.class); adapter.putExtra(EXTRA_LOCATIONID,prefs.getInt(PREF_WIDGET_LociD,-1)); adapter.putExtra(EXTRA_MEALNAME,dmt.mealName); adapter.putExtra(EXTRA_DATE,dmt.date.toString()); views.setRemoteAdapter(R.id.widget_list,adapter); // update manager.updateAppWidget(widgetId,views); } super.onUpdate(context,manager,appWidgetIds);
奇怪的是,当更新发生时,onUpdate()方法运行 – 我看到Log.d调用的输出 – 但我的RemoteViewsFactory中没有调用onDataSetChanged().即使我调用notifyAppWidgetViewDataChanged,也没有效果.
解决方法
我是如何解决它的:
在你的WidgetProviderClass中
adapter.setData(Uri.fromParts("content",String.valueOf(appWidgetIds[i]+randomNumber),null));
randomNumber是一个随机数(WidgetProvider类的公共静态成员).
然后在RemoteViewsFactory类中,执行:
appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()) - WidgetProvider.randomNumber;
这让“服务”认为它必须为另一个小部件创建一个Factory,因此创建一个带有更新值的新工厂,该工厂附加到您的小部件.
希望这可以帮助.
Android Appwidget textview不更新
但是在onRecive方法中,当我尝试使用RemoteViews为我的组件设置文本时,文本不会更新,也不会调用任何错误.我在下面附上了我的代码,任何帮助都会很棒.
谢谢,
中号
package com.android.FirstWidget;import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.appwidgetprovider; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageButton; import android.widget.RemoteViews; public class Exampleappwidgetprovider extends appwidgetprovider { @Override public void onReceive(Context context,Intent intent) { // Todo Auto-generated method stub Log.e("ds",intent.getAction()); Log.e("f","f"); if(intent.getAction().contains("1")){ RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.wid); views.setTextViewText(R.id.textView1,"heyheyhey"); Log.e("fssss","sssf"); } super.onReceive(context,intent); } public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) { final int N = appWidgetIds.length; // Perform this loop procedure for each App Widget that belongs to this provider for (int i=0; i<N; i++) { int appWidgetId = appWidgetIds[i]; // Create an Intent to launch ExampleActivity Intent intent = new Intent(context,Exampleappwidgetprovider.class); intent.setAction("1"); PendingIntent pendingIntent = PendingIntent.getbroadcast(context,intent,0); // Get the layout for the App Widget and attach an on-click listener // to the button RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.wid); views.setonClickPendingIntent(R.id.arrowLeft,pendingIntent); views.setonClickPendingIntent(R.id.arrowRight,pendingIntent); //views.set // Tell the AppWidgetManager to perform an update on the current app widget appWidgetManager.updateAppWidget(appWidgetId,views); } } }
解决方法
package com.android.FirstWidget;import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.appwidgetprovider; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageButton; import android.widget.RemoteViews; public class Exampleappwidgetprovider extends appwidgetprovider { @Override public void onReceive(Context context,Intent intent) { // Todo Auto-generated method stub Log.e("ds",intent.getAction()); Log.e("f","f"); RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.wid); if(intent.getAction().contains("arrow_left")){ views.setTextViewText(R.id.textView1,"left"); Log.e("fssss","sssf"); } else if(intent.getAction().contains("arrow_right")){ views.setTextViewText(R.id.textView1,"right"); Log.e("fssss","sssf"); } else { super.onReceive(context,intent); } ComponentName componentName = new ComponentName(context,Exampleappwidgetprovider.class); AppWidgetManager.getInstance(context).updateAppWidget(componentName,views); } public void onUpdate(Context context,Exampleappwidgetprovider.class); intent.setAction("arrow_left"); PendingIntent pendingIntent = PendingIntent.getbroadcast(context,pendingIntent); intent = new Intent(context,Exampleappwidgetprovider.class); intent.setAction("arrow_right"); pendingIntent = PendingIntent.getbroadcast(context,views.setonClickPendingIntent(R.id.arrowRight,views); } } }
此外,虽然我相信你编码的内容应该可以工作,但如果没有,你可以尝试在清单文件中设置按钮的intent操作.它应该是这样的
<intent-filter > <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> <action android:name="com.android.FirstWidget.arrow_left"/> <action android:name="com.android.FirstWidget.arrow_right"/> </intent-filter>
我想现在应该可以了.我自己偶然发现了这个问题,并在此找到了解决方案:Clickable widgets in android
Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView
我正在尝试打印listView中单击的值,但后来我得到以下异常:
07-04 10:40:56.482: E/AndroidRuntime(1356): FATAL EXCEPTION: main
07-04 10:40:56.482: E/AndroidRuntime(1356): java.lang.classCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
07-04 10:40:56.482: E/AndroidRuntime(1356): at com.passwordkeeper.ui.ActivityHomeScreen$1.onItemClick(ActivityHomeScreen.java:88)
这是一段代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = (TextView) findViewById(R.id.labelList);
db = new DatabaseHandler(this);
createList();
displayList();
}
createList函数正常工作.这是我的displayList方法:
public void displayList(){
this.setlistadapter(new ArrayAdapter<String>(this, R.layout.activity_home_screen, R.id.listTextView, mAccountNames));
mListView = getListView();
mListView.setonItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String product = ((TextView) view).getText().toString();
Log.v("mSelectedProduct", product);
}
});
}
我的文件activity_home_screen.xml的xml代码是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/listTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="28dp"
android:layout_marginTop="26dp"
android:textAppearance="?android:attr/textAppearanceLarge" />
任何帮助都会有用!
谢谢.
解决方法:
你可以试试这个
mListView.setonItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
TextView txtview = (TextView)view.findViewById(R.id.listTextView);
String product = txtview.getText().toString();
Log.v("mSelectedProduct", product);
}
});
Android Widget 中ListView加载网络图片
关于Widget的介绍和用法可以看这两篇博文,写的非常详细了
Android 之窗口小部件详解--App Widget http://www.cnblogs.com/skywang12345/p/3158310.html
Android 之窗口小部件高级篇--App Widget 之 RemoteViews http://www.cnblogs.com/skywang12345/p/3264991.html
上面两篇博文没有提到怎么给Widget中的ListView或者GridView中显示网络图片,而我们的项目的需求中需要Widget中的ListView填充接口获得的文字和图片,试过很多方法最后发现还是以下这种伪同步比较让人满意。
private Map<Integer, Boolean> flags = Collections.synchronizedMap(new HashMap<Integer, Boolean>());
private Bitmap mBitmap;
private Handler handler = new Handler(Looper.getMainLooper());
@Override
public RemoteViews getViewAt(final int position) {
//这里初始化RemoteView,设置监听,等等....
flags.put(position, false);
handler.post(new Runnable() {
@Override
public void run() {
//这里用了ImageLoader,或者别的带有加载回调加载库
ImageLoader.getInstance().loadImage(datas.get(position).getImgUrl, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
flags.put(position, true);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
flags.put(position, true);
}
@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap bitmap) {
mBitmap = bitmap;
flags.put(position, true);
}
});
}
});
//在此一直等待获取到网络图片
while (!flags.get(position)) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flags.put(position, false);
if (mBitmap != null) {
mRemoteViews.setImageViewBitmap(R.id.widget_item_image, mBitmap);
} else {
mRemoteViews.setImageViewResource(R.id.widget_item_image, R.mipmap.ic_launcher);
}
mBitmap = null;
return mRemoteViews;
}
android – AppWidget alarmmanager没有更新
所以,我有一个小部件,我希望它每60秒更新一次.当小部件首次添加到主屏幕时,它会正常运行其更新功能.除此之外,它应该启动一个AlarmManager,它将每60秒重新运行一次更新方法.这是它似乎没有真正做的部分.这是我的代码:
public class ClockWidget extends appwidgetprovider {
public static String CLOCK_WIDGET_UPDATE = "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE";
@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];
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clocklayout);
appWidgetManager.updateAppWidget(appWidgetId, views);
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
Log.d("log","Entered update cycle");
//Unimportant for these purposes
appWidgetManager.updateAppWidget(appWidgetId, views);
}
private PendingIntent createClockTickIntent(Context context) {
Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
PendingIntent pendingIntent = PendingIntent.getbroadcast(context, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Log.d("onEnabled","Widget Provider enabled. Starting timer to update widget every minute");
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, createClockTickIntent(context));
}
@Override
public void ondisabled(Context context) {
super.ondisabled(context);
Log.d("ondisabled", "Widget Provider disabled. Turning off timer");
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(createClockTickIntent(context));
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.d("onReceive", "Received intent " + intent);
if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) {
Log.d("onReceive", "Clock update");
// Get the widget manager and ids for this widget provider, then
// call the shared
// clock update method.
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
for (int appWidgetID: ids) {
updateAppWidget(context, appWidgetManager, appWidgetID);
}
}
}
}
这是我在这个问题上发现的一些教程的产物,以及我自己对Android的了解.根据我的记录,它永远不会到达Log.d(“onReceive”,“Clock update”);线.是的,我的Manifest设置了时钟更新意图.谢谢!
编辑:其他信息.我在createClockTickIntent方法中放了一个日志行,然后它就会触发.所以我想这意味着我的应用程序正在运行alarmManager.setRepeating行,不知道为什么实际上并没有重复.
解决方法:
Arggghhh,这是一个简单的错字.意图过滤器是“com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE”,我写了“com.nickavv.cleanwidget.CLEANCLOCK_UPDATE”
多么痛苦,但嘿,现在我知道了.
所以,对于任何对我有类似问题的人来说,故事的道德:检查你的拼写!检查两次,或十次.在一切!
我们今天的关于android appwidget listview没有更新和android.widget.listview的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android Appwidget textview不更新、Android java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为android.widget.TextView、Android Widget 中ListView加载网络图片、android – AppWidget alarmmanager没有更新的相关信息,请在本站查询。
本文标签: