Android 使用意图配置特定的小部件
我有自动添加到启动程序的小部件,但其中一些小部件需要配置,因此我设置了onClick侦听器来获取id和小部件信息,以启动活动来配置小部件,但我遇到的问题是,当我从活动(例如天气小部件)返回时,失败的部分是在create方法中,当我尝试通过小部件id获取appWidgetInfo时,但是id返回了目的。我不知道出了什么问题谁能帮我解决这个问题吗Android 使用意图配置特定的小部件,android,android-widget,Android,Android Widget,我有自动添加到启动程序的小部件,但其中一些小部件需要配置,因此我设置了onClick侦听器来获取id和小部件信息,以启动活动来配置小部件,但我遇到的问题是,当我从活动(例如天气小部件)返回时,失败的部分是在create方法中,当我尝试通过小部件id获取appWidgetInfo时,但是id返回了目的。我不知道出了什么问题谁能帮我解决这个问题吗 AppWidgetManager mAppWidgetManager; AppWidgetHost mAppWidgetHost;
AppWidgetManager mAppWidgetManager;
AppWidgetHost mAppWidgetHost;
LinearLayout mainlayout;
ComponentName cn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainlayout = (LinearLayout) findViewById(R.id.mylauncher);
mainlayout.setOnClickListener(this);
mAppWidgetManager = AppWidgetManager.getInstance(this);
mAppWidgetHost = new AppWidgetHost(this, R.id.APPWIDGET_HOST_ID);
// search widgets
searchWidgets();
}
public void searchWidgets() {
String widget = "com.weather.Weather.widgets.WeatherWidgetProvider4x1";
try {
mAppWidgetManager = AppWidgetManager.getInstance(getBaseContext());
final List<AppWidgetProviderInfo> infos = mAppWidgetManager
.getInstalledProviders();
AppWidgetProviderInfo appWidgetInfo = null;
for (final AppWidgetProviderInfo info : infos) {
Log.v("Available Widgets", "label " + info.label + " ::"
+ info.provider.getPackageName() + " / "
+ info.provider.getClassName());
}
for (final AppWidgetProviderInfo info : infos) {
Log.v("Searching for Widget class",
info.provider.getPackageName() + " / "
+ info.provider.getClassName());
if (widget.equals(info.provider.getClassName())) {
String packageName = info.provider.getPackageName()
.toString();
cn = new ComponentName(packageName, widget);
// found it
appWidgetInfo = info;
Log.d("FOUND !!!!!!!!!", "Widget class " + packageName);
break;
}
}
mAppWidgetHost = new AppWidgetHost(getBaseContext(),
R.id.APPWIDGET_HOST_ID);
if (appWidgetInfo == null) {
Log.d(TAG, cn + " No such widget available returning view");
// return; // stop here
} else {
int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
AppWidgetHostView hostView = mAppWidgetHost.createView(this,
appWidgetId, appWidgetInfo);
hostView.setAppWidget(appWidgetId, appWidgetInfo);
AppWidgetHostView hostViewsecond = mAppWidgetHost.createView(
this, appWidgetId, appWidgetInfo);
hostView.setAppWidget(appWidgetId, appWidgetInfo);
hostView.setId(appWidgetInfo.previewImage);
Drawable draw = null;
String packageName = appWidgetInfo.provider.getPackageName();
try {
draw = this.getPackageManager().getDrawable(packageName,
appWidgetInfo.previewImage,
this.getPackageManager().getApplicationInfo(packageName,
0));
} catch (NameNotFoundException e) {
Log.d(TAG, "drawable not found",e);
}
ImageView preViewWigdet = new ImageView(this);
preViewWigdet.setImageDrawable(draw);
preViewWigdet.setId(appWidgetInfo.previewImage);
mainlayout.addView(preViewWigdet);
}
} catch (SecurityException securityEx) {
Log.e("Bind Widget",
"Error device not rooted, returning view, Security exception:- ",
securityEx);
}
}
@Override
public void onClick(View v) {
AppWidgetProviderInfo widgetItem = null;
mAppWidgetHost = new AppWidgetHost(this, R.id.APPWIDGET_HOST_ID);
int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
if (view.getClass().equals(ImageView.class)){
// putting installed Providers in a list
final List<AppWidgetProviderInfo> infos = mAppWidgetManager
.getInstalledProviders();
for (int i = 0; i < infos.size(); i++) {
if (infos.get(i).previewImage == view.getId()) {
widgetItem = (AppWidgetProviderInfo) infos.get(i);
}
}
ComponentName cn = new ComponentName(
widgetItem.provider.getPackageName(),
widgetItem.provider.getClassName());
int[] ids;
ids = mAppWidgetManager.getAppWidgetIds(cn);
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
intent.setComponent(widgetItem.configure);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
if (widgetItem.configure != null) {
Log.d(TAG, "widget to be configured " + widgetItem.label);
((Activity) this).startActivityForResult(intent,
R.id.REQUEST_CREATE_APPWIDGET);
}
}
}
/**
* If the user has selected an widget, the result will be in the 'data' when
* this function is called.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "" + resultCode);
if (resultCode == RESULT_OK) {
if (requestCode == R.id.REQUEST_PICK_APPWIDGET) {
configureWidget(data);
}
if (requestCode == R.id.REQUEST_CREATE_APPWIDGET) {
mAppWidgetManager = AppWidgetManager.getInstance(this);
createWidget(data);
}
} else if (resultCode == RESULT_CANCELED && data != null) {
int appWidgetId = data.getIntExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
if (appWidgetId != -1) {
mAppWidgetHost.deleteAppWidgetId(appWidgetId);
}
}
}
/**
* Checks if the widget needs any configuration. If it needs, launches the
* configuration activity.
*/
private void configureWidget(Intent data) {
Bundle extras = data.getExtras();
int appWidgetId = extras
.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager
.getAppWidgetInfo(appWidgetId);
if (appWidgetInfo.configure != null) {
Intent intent = new Intent(
AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
intent.setComponent(appWidgetInfo.configure);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
startActivityForResult(intent, R.id.REQUEST_CREATE_APPWIDGET);
} else {
createWidget(data);
}
}
/**
* Creates the widget and adds to our view layout.
*/
public void createWidget(Intent data) {
Bundle extras = data.getExtras();
int appWidgetId = extras
.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
//this is where I am having the problem, appWidgetInfo returns null
AppWidgetProviderInfo appWidgetInfo = this.mAppWidgetManager
.getAppWidgetInfo(appWidgetId);
AppWidgetHostView hostView = mAppWidgetHost.createView(this,
appWidgetId, appWidgetInfo);
hostView.setAppWidget(appWidgetId, appWidgetInfo);
mainlayout.addView(hostView);
Log.i(TAG, "The widget size is: " + appWidgetInfo.minWidth + "*"
+ appWidgetInfo.minHeight);
}
AppWidgetManager-mAppWidgetManager;
AppWidgetHost mAppWidgetHost;
线性布局主布局;
组件名称cn=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainlayout=(LinearLayout)findViewById(R.id.mylauncher);
mainlayout.setOnClickListener(此);
mAppWidgetManager=AppWidgetManager.getInstance(此);
mAppWidgetHost=新的AppWidgetHost(这个,R.id.APPWIDGET\u HOST\u id);
//搜索小部件
searchWidgets();
}
公共void searchWidgets(){
String widget=“com.weather.weather.widgets.WeatherWidgetProvider4x1”;
试一试{
mAppWidgetManager=AppWidgetManager.getInstance(getBaseContext());
最终列表infos=mAppWidgetManager
.getInstalledProviders();
AppWidgetProviderInfo appWidgetInfo=null;
对于(最终AppWidgetProviderInfo:infos){
Log.v(“可用小部件”、“标签”+info.label+”:“
+info.provider.getPackageName()+“/”
+info.provider.getClassName());
}
对于(最终AppWidgetProviderInfo:infos){
Log.v(“搜索小部件类”,
info.provider.getPackageName()+“/”
+info.provider.getClassName());
if(widget.equals(info.provider.getClassName())){
字符串packageName=info.provider.getPackageName()
.toString();
cn=新组件名称(packageName、widget);
//找到了
appWidgetInfo=info;
Log.d(“找到!!!!!!!”,“Widget类”+packageName);
打破
}
}
mAppWidgetHost=新的AppWidgetHost(getBaseContext(),
R.id.APPWIDGET_HOST_id);
if(appWidgetInfo==null){
Log.d(TAG,cn+“没有可用的小部件返回视图”);
//return;//停在这里
}否则{
int-appWidgetId=mAppWidgetHost.allocateAppWidgetId();
AppWidgetHostView hostView=mAppWidgetHost.createView(此,
appWidgetId、appWidgetInfo);
setAppWidget(appWidgetId,appWidgetInfo);
AppWidgetHostView hostViewsecond=mAppWidgetHost.createView(
这是(appWidgetId、appWidgetInfo);
setAppWidget(appWidgetId,appWidgetInfo);
setId(appWidgetInfo.previewImage);
可提取提取=空;
字符串packageName=appWidgetInfo.provider.getPackageName();
试一试{
draw=this.getPackageManager().getDrawable(packageName,
appWidgetInfo.previewImage,
这个.getPackageManager().getApplicationInfo(packageName,
0));
}catch(nameNotFounde异常){
日志d(标签“未找到可提取文件”,e);
}
ImageView preViewWigdet=新的ImageView(此);
预览IGDET.setImageDrawable(绘图);
preViewWigdet.setId(appWidgetInfo.previewImage);
mainlayout.addView(预览IGDET);
}
}捕获(SecurityException securityEx){
Log.e(“绑定小部件”,
错误设备未根目录,返回视图,安全异常:-“,
证券交易所);
}
}
@凌驾
公共void onClick(视图v){
AppWidgetProviderInfo widgetItem=null;
mAppWidgetHost=新的AppWidgetHost(这个,R.id.APPWIDGET\u HOST\u id);
int-appWidgetId=mAppWidgetHost.allocateAppWidgetId();
if(view.getClass().equals(ImageView.class)){
//将已安装的提供程序放入列表中
最终列表infos=mAppWidgetManager
.getInstalledProviders();
对于(int i=0;i