我试图让我的启动器添加一个自定义安装的小部件,就像库存启动器那样。
我的代码没有显示任何错误,但是当我运行应用时,它会在此活动中崩溃。
这是它显示的错误
03-11 15:13:55.993 4576-4576/com.example.easylauncher I/art﹕ Late-enabling -Xcheck:jni
03-11 15:13:55.993 4576-4576/com.example.easylauncher I/art﹕ VMHOOK: rlim_cur : 0 pid:4576
03-11 15:13:56.023 4576-4586/com.example.easylauncher I/art﹕ Debugger is no longer active
03-11 15:13:56.133 4576-4576/com.example.easylauncher D/Atlas﹕ Validating map...
03-11 15:13:56.193 4576-4595/com.example.easylauncher I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030__release_AU ()
OpenGL ES Shader Compiler Version: E031.25.03.00
Build Date: 12/11/14 Thu
Local Branch:
Remote Branch: refs/tags/AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030
Local Patches: NONE
Reconstruct Branch: NOTHING
03-11 15:14:00.983 4576-4576/com.example.easylauncher E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.easylauncher, PID: 4576
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.easylauncher/com.example.easylauncher.AdvancedActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.appwidget.AppWidgetHost.allocateAppWidgetId()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2322)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.appwidget.AppWidgetHost.allocateAppWidgetId()' on a null object reference
at com.example.easylauncher.AdvancedActivity.<init>(AdvancedActivity.java:56)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1572)
at android.app.Instrumentation.newActivity(Instrumentation.java:1083)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2312)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
这是我的代码:
public class AdvancedActivity extends Activity {
DrawerAdapter drawerAdapterObject;
GridView drawerGrid;
SlidingDrawer slidingDrawer;
RelativeLayout homeView;
class Pac{
Drawable icon;
String name;
String packageName;
String label;
}
Pac[] pacs;
PackageManager pm;
static boolean appLaunchable = true;
Button widgetButton;
AppWidgetManager appWidgetManager;
AppWidgetHost appWidgetHost;
AppWidgetProviderInfo newAppWidgetProviderInfo = new AppWidgetProviderInfo();
// Get an id
int appWidgetId = appWidgetHost.allocateAppWidgetId();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_advanced);
drawerGrid = (GridView) findViewById(R.id.content);
slidingDrawer = (SlidingDrawer) findViewById(R.id.drawer);
homeView = (RelativeLayout) findViewById(R.id.home_view);
pm =getPackageManager();
set_pacs();
slidingDrawer.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener() {
@Override
public void onDrawerOpened() {
appLaunchable=true;
}
});
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
registerReceiver(new PacReceiver(), filter);
appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetHost = new AppWidgetHost(this, 1);
addwidgetButtonListener();
}
public void show (){
ListView listView = new ListView(this);
listView.setAdapter(new ArrayAdapter<String>(this, R.layout.dialog_list, new String[]{"Themes", "Settings", "Help"}));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
// arg0 is your adapter, arg1 is the view clicked, arg2 is the position and arg3 is the id.
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
switch(arg2){
case(1): //change 0 for themes 1 for advanced 2 for help
Intent intent= new Intent(AdvancedActivity.this,SettingsActivity.class);
startActivity(intent);
break;
case(0):
Toast.makeText(getApplicationContext(), "Coming soon!", Toast.LENGTH_SHORT).show();
break;
case(2):
Toast.makeText(getApplicationContext(), "Coming soon!", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
});
Dialog dialog = new Dialog(this);
dialog.setTitle("Settings");
dialog.setContentView(listView);
dialog.show();
}
final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
public void onLongPress(MotionEvent m) {
//enter long press here
show();
}
});
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
public void set_pacs(){
Intent mainIntent = new Intent(Intent.ACTION_MAIN,null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> pacsList = pm.queryIntentActivities(mainIntent, 0);
pacs = new Pac[pacsList.size()];
for(int I=0;I<pacsList.size();I++){
pacs[I]= new Pac();
pacs[I].icon=pacsList.get(I).loadIcon(pm);
pacs[I].packageName=pacsList.get(I).activityInfo.packageName;
pacs[I].name=pacsList.get(I).activityInfo.name;
pacs[I].label=pacsList.get(I).loadLabel(pm).toString();
}
new SortApps().exchange_sort(pacs);
drawerAdapterObject = new DrawerAdapter(this, pacs);
drawerGrid.setAdapter(drawerAdapterObject);
drawerGrid.setOnItemClickListener(new DrawerClickListener(this, pacs, pm));
//for long click drawerGrid.setOnItemLongClickListener(new DrawerLongClickListener(this, slidingDrawer, homeView,pacs));
}
public class PacReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
set_pacs();
}
}
public void createwidget(){
// Get the list of installed widgets
List<AppWidgetProviderInfo> appWidgetInfos = new ArrayList<AppWidgetProviderInfo>();
appWidgetInfos = appWidgetManager.getInstalledProviders();
// Create Widget
AppWidgetHostView hostView = appWidgetHost.createView(this, appWidgetId, newAppWidgetProviderInfo);
hostView.setAppWidget(appWidgetId, newAppWidgetProviderInfo);
// Add it to your layout
RelativeLayout rl = (RelativeLayout) findViewById(R.id.home_view);
rl.addView(hostView);
}
public void addwidgetButtonListener() {
widgetButton = (Button) findViewById(R.id.button);
widgetButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
createwidget();
}
});
}
}
答案 0 :(得分:0)
移动appWidgetId = appWidgetHost.allocateAppWidgetId();
(将int appWidgetId
留作会员类)
appWidgetHost = new AppWidgetHost(this, 1);
之后的onCreate中
代码appWidgetHost
中的
在您访问时尚未初始化。 E.g
int appWidgetId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_advanced);
//.. other code
appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetHost = new AppWidgetHost(this, 1);
appWidgetId = appWidgetHost.allocateAppWidgetId()