- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用小部件实现 android 应用程序,但在 nexus 5 设备上发现了奇怪的行为(我有两个 - 一个是 Lollipop ,一个是棉花糖)。如果我调用 AppWidgetManager.notifyAppWidgetViewDataChanged,小部件的 ListView 内容会在其他设备(Nexus 3、ASUS K010)上刷新,但在这两个设备上没有任何反应。找不到关于此的任何信息。
这是我的代码:MainActivity.java。
public class MainActivity extends AppCompatActivity {
public static final String PREFS_TAG = "StringList";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View v = findViewById(R.id.fill);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fillWidget();
}
});
v= findViewById(R.id.clear);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clearWidget();
}
});
}
private void fillWidget(){
SharedPreferences preferences = getSharedPreferences(WidgetRemoteService.class.getSimpleName(), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
Set<String> strings = new HashSet<>();
strings.add("111111111111111");
strings.add("222222222222222");
strings.add("333333333333333");
strings.add("444444444444444");
strings.add("555555555555555");
strings.add("666666666666666");
strings.add("777777777777777");
strings.add("888888888888888");
strings.add("999999999999999");
editor.putStringSet(PREFS_TAG, strings);
editor.commit();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
ComponentName componentName = new ComponentName(getApplicationContext(),WidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(componentName);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.listView);
}
private void clearWidget(){
SharedPreferences preferences = getSharedPreferences(WidgetRemoteService.class.getSimpleName(), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.remove(PREFS_TAG);
editor.commit();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
ComponentName componentName = new ComponentName(getApplicationContext(),WidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(componentName);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.listView);
}
}
WidgetProvider.java
public class WidgetProvider extends AppWidgetProvider {
private static final String TAG = WidgetProvider.class.getSimpleName();
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
for (int appWidgetId : appWidgetIds) {
appWidgetManager.updateAppWidget(appWidgetId,createRemoteViews(context, appWidgetId));
}
}
public static RemoteViews createRemoteViews(Context context, int appWidgetId){
Log.e(TAG, "Creating remote views");
Intent intent = new Intent(context, WidgetRemoteService.class);
// Add the app widget ID to the intent extras.
Log.e(TAG, "Creating remote views for widget #"+appWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews result = new RemoteViews(WidgetProvider.class.getPackage().getName(),R.layout.widget_layout);
result.setRemoteAdapter(R.id.listView,intent);
return result;
}
}
WidgetRemoteService.java
public class WidgetRemoteService extends RemoteViewsService {
private static final String TAG = WidgetRemoteService.class.getSimpleName();
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
int appWidgetID = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
return new WidgetViewsFactory(getApplicationContext(), appWidgetID);
}
public static class WidgetViewsFactory implements RemoteViewsService.RemoteViewsFactory{
private Context context;
private String[] strings;
private int appWidgetId;
public WidgetViewsFactory(Context context, int appWidgetId){
Log.e(TAG, "Factory created");
this.context = context;
this.appWidgetId = appWidgetId;
}
@Override
public void onCreate() {
}
@Override
public void onDataSetChanged() {
Log.e(TAG, "Dataset changed");
SharedPreferences preferences = context.getSharedPreferences(WidgetRemoteService.class.getSimpleName(), Context.MODE_PRIVATE);
Set<String> stringSet = preferences.getStringSet(MainActivity.PREFS_TAG, new HashSet<String>());
strings = stringSet.toArray(new String[]{});
}
@Override
public void onDestroy() {
}
@Override
public int getCount() {
if (strings==null)
return 0;
else
return strings.length;
}
@Override
public RemoteViews getViewAt(int position) {
RemoteViews result = new RemoteViews(getClass().getPackage().getName(),R.layout.widget_item);
result.setTextViewText(R.id.textTitle,"This is title");
result.setTextViewText(R.id.textContent,strings[position]);
return result;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
}
}
在这里,我尝试从 MainActivity 更新小部件,但不知何故它在我的 nexus 5 设备上不起作用 - 根据日志,onDataSetChanged() 从未在此设备上调用,但在其他设备上它有效。也许我误解了指南中的某些内容,它不应该工作,并且只是因为一些错误而在其他设备上工作,这个错误在后来的 android 版本中得到了修复?
最佳答案
尝试添加
android:permission="android.permission.BIND_REMOTEVIEWS"
到AndroidManifest.xml
中的RemoteViewsService
,我今天也遇到了这个问题。
关于android - 调用 notifyAppWidgetViewDataChanged 后,不会在 RemoteViewsFactory 中调用 onDataSetChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33869530/
我有一个运行良好的基于 ListView 的小部件,它依赖于 JSON 网络服务调用来填充自身。我有一个刷新按钮,效果很好,并强制从网络重新加载。我通过使用自定义广播来做到这一点,然后依次调用 o
这个问题在这里已经有了答案: onGetViewFactory only called once for multiple widgets (3 个答案) 关闭 5 年前。 我正在构建一个小部件来加
我正在尝试获取一些最新的电影图像并将它们显示在 Android 应用小部件中,根据要求,小部件应每小时刷新一次以获取最新的电影图像。 由于我在整个应用程序中使用协程,因此我需要使用现有的具有挂起功能的
我正在尝试使用小部件实现 android 应用程序,但在 nexus 5 设备上发现了奇怪的行为(我有两个 - 一个是 Lollipop ,一个是棉花糖)。如果我调用 AppWidgetManager
我根据 android 文档开发了我的 AppWidget,在 onCreate() 中加载我的光标并在 onDataSetChanged() 中重新加载它,并且一切正常,直到我在 RemoteVie
我是一名优秀的程序员,十分优秀!