将已安装的小部件添加到我的Android Activity时出错

时间:2015-03-11 15:27:00

标签: java android android-widget android-appwidget android-launcher

我试图让我的启动器添加一个自定义安装的小部件,就像库存启动器那样。

我的代码没有显示任何错误,但是当我运行应用时,它会在此活动中崩溃。

这是它显示的错误

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();
            }
        });
    }
}

1 个答案:

答案 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()