android - AppWidgetHost 不更新小部件

标签 android android-fragments android-widget host android-appwidget

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

LauncherActivity.java

  • 非常简单,只需调用带有布局的 setContentView。

ma​​in.xml

  • 包含几个 fragment ,其中一个包含 AppWidgetHost。

CodeRedWidgetHostFragment.java

  • onCreateView
    创建 AppWidgetHost 和 AppWidgetManager 的实例
    使用存储在首选项中的小部件 ID 创建和设置我的主机 View

  • onStart()
    appWidgetHost.startListening()

  • onStop()
    appWidgetHost.stopListening()

当我获得 AppWidgetHost 和 AppWidgetManager 的实例时,我正在使用 getActivity() 来获取 Fragments 托管 Activity 。我想知道这是否是我的小部件未更新的原因?

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

我应该提到,我在我的 AppWidgetHost 中的另一个 Activity 中选择了我想要的小部件,该 Activity 将所选小部件的 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 状态。这意味着无论 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(), appWidgetId, info);

关于android - AppWidgetHost 不更新小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22827051/

相关文章:

java接口(interface)类型作为方法参数 - 如何将两种方法合二为一

java - 获取包含具有特定值的子对象的节点

Android fragment 选项卡示例

android - 为所有 fragment 保留相同的操作栏

android - Widget Application ForceCloses 安装

android - 如何在Android中使用Traceview工具?

android - Facebook "feed"对话框显示问题

android - 在选项卡布局中看不到我的 cardView

java - 下面一行 - 在不使用相同名称的情况下制作三个微调器和玩家添加或选择

android - 静态访问 Android 应用程序的资源?