GVKun编程网logo

android – AppWidgetHost不更新小部件(androidsupportdesignwidget不存在)

28

如果您想了解android–AppWidgetHost不更新小部件和androidsupportdesignwidget不存在的知识,那么本篇文章将是您的不二之选。我们将深入剖析android–App

如果您想了解android – AppWidgetHost不更新小部件androidsupportdesignwidget不存在的知识,那么本篇文章将是您的不二之选。我们将深入剖析android – AppWidgetHost不更新小部件的各个方面,并为您解答androidsupportdesignwidget不存在的疑在这篇文章中,我们将为您介绍android – AppWidgetHost不更新小部件的相关知识,同时也会详细的解释androidsupportdesignwidget不存在的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

android – AppWidgetHost不更新小部件(androidsupportdesignwidget不存在)

android – AppWidgetHost不更新小部件(androidsupportdesignwidget不存在)

我可以在片段中使用AppWidgetHost吗?我无法将大多数小部件添加到我的AppWidgetHost中进行更新.这是我的情景..

LauncherActivity.java

>非常简单,只需使用布局调用setContentView.

main.xml中

>包含一些片段,包括其中包含AppWidgetHost的片段.

CodeRedWidgetHostFragment.java

> onCreateView
创建AppWidgetHost&的实例AppWidgetManager
使用我存储在首选项中的窗口小部件ID创建和设置主机视图
> onStart()
appWidgetHost.startListening()
> onStop()
appWidgetHost.stopListening()

当我得到AppWidgetHost和AppWidgetManager的实例时,我正在使用getActivity()来获取Fragments托管活动.我想知道这是不是我的小部件没有更新的原因?

有些小部件实际上会更新,例如模拟时钟,但是,Youtube小部件不会自动循环显示视频缩略图.

我应该提一下,我在AppWidgetHost中选择了我想要的小部件,在另一个活动中将所选小部件的id存储在SharedPreferences中.

这是我的Fragment类的代码.

package com.brockoli.android.codered.widgethost;

import android.app.Fragment;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.appwidgetproviderInfo;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.brockoli.android.codered.R;

public class CodeRedWidgetHostFragment extends Fragment {
private static final String TAG = CodeRedWidgetHostFragment.class.getSimpleName();

public static final String CODERED_WIDGET_ID = "CODERED_WIDGET_ID";

private SharedPreferences mSharedPrefsWidgets;

AppWidgetManager mAppWidgetManager;
AppWidgetHost mAppWidgetHost;

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    View parentView = inflater.inflate(R.layout.widget_host,null);

    mSharedPrefsWidgets = getActivity().getSharedPreferences("codered_widgets",0);

    mAppWidgetManager = AppWidgetManager.getInstance(getActivity());
    mAppWidgetHost = new AppWidgetHost(getActivity(),R.id.APPWIDGET_HOST_ID);

    createWidget(parentView);

    return parentView;
}

@Override
public void onStart() {
    super.onStart();
    mAppWidgetHost.startListening();
}

@Override
public void onStop() {
    super.onStop();
    mAppWidgetHost.stopListening();
}


@Override
public void onResume() {
    super.onResume();
    createWidget(getView());
}

/**
 * Creates the widget and adds to our view layout.
 */
public void createWidget(View v) {
    if (v != null) {
        // Remove any existing widgets from the widget host
        ((ViewGroup) v).removeAllViews();
        int appWidgetId = mSharedPrefsWidgets.getInt(CODERED_WIDGET_ID,-1);
        if (appWidgetId > -1) {
            appwidgetproviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
            AppWidgetHostView hostView = mAppWidgetHost.createView(getActivity(),appWidgetId,appWidgetInfo);
            hostView.setAppWidget(appWidgetId,appWidgetInfo);
            ((ViewGroup) v).addView(hostView);
            Log.i(TAG,"The widget size is: " + appWidgetInfo.minWidth + "*" + appWidgetInfo.minHeight);
        }   
    }
}
}

解决方法

基于Clemens的回答,AppWidgetHost应该在应用程序的整个生命周期中保持活跃状态​​.这意味着无论Activity如何,您都应该可以轻松访问应用程序的AppWidgetHost和AppWidgetManager实例.
public class YourApp extends Application {

    private static final int HARDCODED_ID = 0; 

    private static AppWidgetHost appWidgetHost;
    private static AppWidgetManager appWidgetManager;

    @Override
    public void onCreate() {
        super.onCreate();

        appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
        appWidgetHost = new AppWidgetHost(getApplicationContext(),HARDCODED_ID);
        appWidgetHost.startListening();
    }

    @Override
    public void onTerminate() {
        super.onTerminate();

        appWidgetHost.stopListening();
        appWidgetHost = null;
    }

    public static AppWidgetHost getAppWidgetHost() { return appWidgetHost; }

    public static AppWidgetManager getAppWidgetManager() { return appWidgetManager; }

}

我当前的实现已正确更新.测试了许多需要“实时”更新的应用,例如我的音乐播放器小部件.

请记住,应用程序上下文用于确保AppWidgetHost和AppWidgetManager的上下文始终可用.

此外,在其小部件中使用AppCompat库的较新小部件目前在com.android.support:appcompat-v7:23.1.1依赖项中存在错误.为避免这种情况,请在调用以下内容时使用应用程

AppWidgetHostView hostView = YourApp.getAppWidgetHost()
            .createView(context.getApplicationContexxt(),info);

android appwidget listview没有更新

android appwidget listview没有更新

我编写了一个AppWidget,它从ContentProvider中显示ListView中的一些数据,但是我无法更新它.当我第一次创建窗口小部件时,它会正确填充,但在AlarmManager的PendingIntent到达后,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,也没有效果.

解决方法

这是因为您的RemoteViewsFactory缓存了为每个窗口小部件ID创建的工厂.因此,当相同的小部件发送创建新工厂的请求(通过Widget适配器服务)时,将返回相同的工厂.因此,列表视图不是“更新的”.

我是如何解决它的:

在你的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不更新

Android Appwidget textview不更新

嗨即时通讯我的 Android小部件有一个非常奇怪的问题,香港专业教育学院看起来很多地方,但我似乎无法弄清楚什么是错的.基本上我在我的小部件中调用pendingintent广播并成功地在onrecivie方法中捕获该意图.

但是在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);

        } 

    }
}

解决方法

你需要在onRecieve方法的末尾添加几行….它应该像这样..

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 appwidget 笔记

android appwidget 笔记

AppWidget 就是我们使用的窗口小部件

实现 appwidget 非常简单,只需要一下几个步骤就 OK

1. 在 /res/layout 中建立一个 布局文件。此布局文件就是 窗体小部件 的 "样子"

2. 在 /res/xml 中建立一个 xml 文件此文件对 appwidget 进行配置。如下

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="1dp"	
    android:minHeight="1dp"
    android:updatePeriodMillis="4000000"
    android:initialLayout="@layout/appwidgetlayout">
    <!-- 从上到下
    	宽
    	高
    	更新毫秒数
    	appwidget的初始化的布局 引用 res/layout 中的布局
     -->    
</appwidget-provider>

3. 实现一个类继承 AppWidgetProvider 

public class AppWeigetTest extends AppWidgetProvider {
	private static final String in="joker.broadcast.appwedget";
	//当到达指定的更新时间之后,或用户添加窗口小部件时触发
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// TODO Auto-generated method stub
		super.onUpdate(context, appWidgetManager, appWidgetIds);		
	}
	//当用户删除窗体部件时触发
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		// TODO Auto-generated method stub	
	}
	//当所有船体部件删除时触发
	@Override
	public void onDisabled(Context context) {
		// TODO Auto-generated method stub
	}
	//接收到广播的时候触发,以上几个方法是使用这个方法转发的,也就是说其实窗口的各种"事件" 都是使用广播的形式发出的
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		super.onReceive(context, intent);
	}
}
4. 在 AndroidManifest.xml

<receiver android:name=".AppWeigetTest">
             <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>
以上 intent-filter 和 meta-data 是系统设置不变的,其中 meta-data 的 resource 下的文件是 appwidget 的配置文件

二,Appwidget 中常用类的使用:

1.PendingIntent  

           此类是包装 Intent 类的 使 Intent 在特定的事件触发    

PendingIntent包装Intent意图 初始化方法有:getActivity getBroadcast getService
//参1 上下文对象 参数3 Intent对象
PendingIntent pending=PendingIntent.getActivity(context, 0, inten, 0);
2.RemoteViews

         此类可以对:"小部件" 上的控件进行操作 (比如改变 TextView 上的文字 ImageView 上的图片操作,改变图片添加事件) 

RemoteViews remote=new RemoteViews(context.getPackageName(), R.layout.appwidgetlayout);
			//为窗口小部件上的控件添加点击事件
			//参数一: 指定窗口小部件上的控件ID
			//参数2 :指定触发事件后执行的Intent 的PendingIntent
remote.setOnClickPendingIntent(R.id.button1, pending); //像button1添加一个点击事件
3 AppWidgetManager

在 onXXX 事件中做为参数传递进来的,此类的对象负责更新 Appwidget 

			AppWidgetManager manager=AppWidgetManager.getInstance(context);    
			ComponentName name=new ComponentName(context, AppWeigetTest.class);//代表AppWeiget控件
			//以上两个步骤是在没有appwidgetmanager对象的时候,比如在onReceive方法里如何使用
			manager.updateAppWidget(name, remoteViews); //此方法更新appwidget并且执行remoteViews只有执行这个方法后remoteViews配置的信息才会生效



Android AppWidgetProviderInfo图标ID

Android AppWidgetProviderInfo图标ID

如何解决Android AppWidgetProviderInfo图标ID?

| Android的“ 0”类包含一个整数“ 1”字段。我想将图标保留为
Drawable
。 我认为图标ID需要针对某些软件包的ѭ3进行解析。窗口小部件提供程序不是我的应用程序的一部分,因此
getResources()
返回的我自己的应用程序资源无用。 resources5ѭ也没有给出系统资源。 如何将这个整数id转换为Drawable?     

解决方法

使用
PackageManager
getResourcesForApplication()
。     ,就像CommonsWare所说的那样,您将需要使用getResourcesForApplication() 这是您可以使用它的方法,而且由于棒棒糖有一个loadIcon()函数,使用起来更容易
Drawable icon = null;
if (Build.VERSION.SDK_INT >= 21) {
    icon = info.loadIcon(this,density);
} else {
    try {
        String packageName = info.provider.getPackageName();
        Resources resources = context.getPackageManager().getResourcesForApplication(packageName);
        icon = resources.getDrawable(info.icon);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
}
    

我们今天的关于android – AppWidgetHost不更新小部件androidsupportdesignwidget不存在的分享就到这里,谢谢您的阅读,如果想了解更多关于android appwidget listview没有更新、Android Appwidget textview不更新、android appwidget 笔记、Android AppWidgetProviderInfo图标ID的相关信息,可以在本站进行搜索。

本文标签: