在 android 启动器中托管小部件
我正在为 android 制作一个启动器,但我被困在小部件部分.我在互联网上搜索了大约一个半小时,试图弄清楚如何在我的应用程序中托管小部件,但没有运气.
I am making a launcher for android, and I'm stuck at the widget part. I've been searching for about an hour and a half on the internet trying to figure out how can I host widgets in my application, but no luck.
我已经查看了一些库存启动器和 ADW 启动器代码,但两者都只有数英里的代码,这是我第一次制作启动器.
I have went through some stock launchers and ADW launcher codes but both just have miles of code and this is the first time I'm making a launcher.
有人可以指导我如何将小部件添加到我的启动器中吗?或者至少发布任何链接/教程?请解释一下,因为这是我第一次.
Could someone please guide me through how can I add widgets into my launcher? Or at least post any links/tutorials? Please explain it since this is my first time.
推荐答案
试试这个:
final int APPWIDGET_HOST_ID = 2048;
final int REQUEST_PICK_APPWIDGET = 0;
final int REQUEST_CREATE_APPWIDGET = 5;
AppWidgetManager appWidgetManager;
AppWidgetHost appWidgetHost;
// Let user pick a widget from the list of intalled AppWidgets
public void selectWidget()
{
int appWidgetId = this.appWidgetHost.allocateAppWidgetId();
Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
addEmptyData(pickIntent);
startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
}
// For some reason you have to add this empty data, else it won't work
public void addEmptyData(Intent pickIntent)
{
ArrayList<AppWidgetProviderInfo> customInfo =
new ArrayList<AppWidgetProviderInfo>();
pickIntent.putParcelableArrayListExtra(
AppWidgetManager.EXTRA_CUSTOM_INFO, customInfo);
ArrayList<Bundle> customExtras = new ArrayList<Bundle>();
pickIntent.putParcelableArrayListExtra(
AppWidgetManager.EXTRA_CUSTOM_EXTRAS, customExtras);
};
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (resultCode == RESULT_OK ) {
if (requestCode == REQUEST_PICK_APPWIDGET) {
configureWidget(data);
}
else if (requestCode == REQUEST_CREATE_APPWIDGET) {
createWidget(data);
}
}
else if (resultCode == RESULT_CANCELED && data != null) {
int appWidgetId =
data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
if (appWidgetId != -1) {
appWidgetHost.deleteAppWidgetId(appWidgetId);
}
}
}
// Show configuration activity of the widget picked by the user
private void configureWidget(Intent data) {
Bundle extras = data.getExtras();
int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
AppWidgetProviderInfo appWidgetInfo =
appWidgetManager.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, REQUEST_CREATE_APPWIDGET);
} else {
createWidget(data);
}
}
// Get an instance of the selected widget as a AppWidgetHostView
public void createWidget(Intent data) {
Bundle extras = data.getExtras();
int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId);
AppWidgetHostView hostView = appWidgetHost.createView(this, appWidgetId, appWidgetInfo);
hostView.setAppWidget(appWidgetId, appWidgetInfo);
// Add it on the layout you want
myLayout.addView(hostView);
}
// Call this when you want to remove one from your layout
public void removeWidget(AppWidgetHostView hostView) {
appWidgetHost.deleteAppWidgetId(hostView.getAppWidgetId());
// Remove from your layout
myLayout.removeView(hostView);
}
@Override
protected void onStart() {
super.onStart();
appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetHost = new AppWidgetHost(this, APPWIDGET_HOST_ID);
// Start listening to pending intents from the widgets
appWidgetHost.startListening();
}
@Override
protected void onStop() {
super.onStop();
appWidgetHost.stopListening();
}
只要您想显示设备上安装的 AppWidget 列表以供选择,您只需调用方法 selectWidget()
.
All you've got to do is call the method selectWidget()
whenever you want to show a list of AppWidgets installed on the device to pick from.
此代码有点像普通 Android 启动器的修改版本.
This code is a bit of a modified version of the stock Android launcher.
编辑:
要绑定小部件 ID,即让小部件更新并响应用户交互,请参阅此处的解决方案:小部件在重新时不响应- 通过代码添加
To bind widget IDs, i.e. make widgets update and respond to user interaction, refer the solution here: Widgets don't respond when re-added through code
相关文章