【发布时间】:2014-05-14 15:46:08
【问题描述】:
我可以在Fragment 中使用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);
}
}
}
}
【问题讨论】:
-
我刚刚尝试从link 运行 WidgetHostExample 代码,发现它也没有更新小部件。所以,更多信息。我在 Jynxbox M6 Android 电视盒上运行它。操作系统 4.1.2
-
也许有人可以指出一些实现 AppWidgetHost 并实际更新小部件的开源代码?我尝试了几个项目,这些项目是如何使用 AppWidgetHost 的示例,但它们都有相同的行为,即不更新附加的小部件。
标签: android android-fragments android-widget host android-appwidget