我可以在aAppWidgetHost
中使用Fragment
吗?我无法将大多数小部件添加到appwidgethost进行更新。这是我的设想。
启动器活动.java
非常简单,只需使用布局调用setContentView。
主.xml
包含两个片段,其中一个片段包含appwidgethost。
coderedwidgethostfragment.java代码onCreateView
创建appwidgethost和appwidgetmanager的实例
使用我存储在首选项中的小部件ID创建和设置我的主机视图onStart()
appwidgethost.startsistering()onStop()
appwidgethost.stopListening()
当我得到appwidgethost和appwidgetmanager的实例时,我使用get activity()来获取托管活动的片段。我想知道这是不是我的小部件没有更新的原因?
有些小部件确实会更新,例如模拟时钟,但是youtube小部件不会自动循环播放视频缩略图。
我应该提到的是,我在另一个将所选小部件的id存储在sharedpreferences中的活动中,在appwidgethost中选择了所需的小部件。
这是我的片段类的代码。
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应该在应用程序的整个生命周期中都是活动的。这意味着无论什么活动,您都应该在应用程序易于访问的地方拥有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依赖项中有一个bug。要避免这种情况,请在调用以下内容时使用应用程序上下文。
AppWidgetHostView hostView = YourApp.getAppWidgetHost()
.createView(context.getApplicationContexxt(), appWidgetId, info);