首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将已安装的小部件添加到我的Android活动时出错

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

Stack Overflow用户
提问于 2015-03-11 23:27:00
回答 1查看 327关注 0票数 0

我正在尝试允许我的启动器添加一个自定义安装的小部件,就像股票启动器所做的那样。

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

这是它显示的错误

代码语言:javascript
复制
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)

下面是我的代码:

代码语言:javascript
复制
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();
            }
        });
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-03-11 23:30:36

移动appWidgetId = appWidgetHost.allocateAppWidgetId(); (将int appWidgetId保留为成员类)

appWidgetHost = new AppWidgetHost(this, 1);之后的onCreate中

在您的代码中,当您访问appWidgetHost时,它还没有初始化。E.g

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28990721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档