Android(安卓)Widget 小部件(三) 在Activity中添加Widget
16lz
2021-12-04
package com.stone.ui;import static android.util.Log.d;import android.app.Activity;import android.appwidget.AppWidgetHost;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProviderInfo;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnLongClickListener;import android.widget.FrameLayout;import android.widget.FrameLayout.LayoutParams;/** * 在activity中,长按,弹出widget选择界面, * 选择的widget有配置就先弹出, * 创建widget的view 将view加载到 activity中 */public class AddWidgetActivity extends Activity {private AppWidgetHost mAppWidgetHost;private AppWidgetManager mAppWidgetManager;private FrameLayout frameLayout;private static final int REQUEST_PICK_APPWIDGET = 1;private static final int REQUEST_CREATE_APPWIDGET = 2;private static final int APPWIDGET_HOST_ID = 0x100;//用于标识private static final String EXTRA_CUSTOM_WIDGET = "custom_widget"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAppWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); mAppWidgetHost = new AppWidgetHost(getApplicationContext(), APPWIDGET_HOST_ID); //开始监听widget的变化 mAppWidgetHost.startListening(); frameLayout = new FrameLayout(this); frameLayout.setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {showWidgetChooser();return true;}}); setContentView(frameLayout); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case REQUEST_PICK_APPWIDGET: addAppWidget(data); break; case REQUEST_CREATE_APPWIDGET: completeAddAppWidget(data); break; } } else if (requestCode == REQUEST_PICK_APPWIDGET && resultCode == RESULT_CANCELED && data != null) { // Clean up the appWidgetId if we canceled int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); if (appWidgetId != -1) { mAppWidgetHost.deleteAppWidgetId(appWidgetId); } } } /** * 选中了某个widget之后,根据是否有配置来决定直接添加还是弹出配置activity * @param data */ private void addAppWidget(Intent data) { int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); String customWidget = data.getStringExtra(EXTRA_CUSTOM_WIDGET); d("addAppWidget", "data:"+ customWidget); if ("search_widget".equals(customWidget)) { //这里直接将search_widget删掉了 mAppWidgetHost.deleteAppWidgetId(appWidgetId); } else { AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId); d("addAppWidget", "configure:"+ appWidget.configure); if (appWidget.configure != null) { //有配置,弹出配置 Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); intent.setComponent(appWidget.configure); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); startActivityForResult(intent, REQUEST_CREATE_APPWIDGET); } else { //没有配置,直接添加 completeAddAppWidget(data); } } } /** * 请求添加一个新的widget:用于选取系统中的widget */ private void showWidgetChooser() { int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET); } /** * 添加widget * @param data */ private void completeAddAppWidget(Intent data) { Bundle extras = data.getExtras(); int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); d("completeAddAppWidget", "dumping extras content="+extras.toString()); d("completeAddAppWidget", "appWidgetId:"+ appWidgetId); AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); View hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); frameLayout.setLayoutParams(new LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, appWidgetInfo.minHeight)); frameLayout.addView(hostView); }}
参考:
http://chroya.iteye.com/blog/825407
更多相关文章
- Android(安卓)P SystemUI添加VoWiFi Tile
- Android动态添加删除recycleview并动态保存recycleview中的的数
- Android(安卓)常用的ui(单选框 多选框 下拉列表框 拖动条)
- Android(安卓)打包出错 failed for task ':app:lintVitalRelease
- Android(安卓)问题集合
- android实现拨打电话
- android string.xml中添加特殊字符
- Android(安卓)原生SQLite数据库操作实战
- 高德地图Android,绘制自定义定位蓝点、marker、面