长按 ListView 项目的 Android onCreateContextMenu 致命异常

Posted

技术标签:

【中文标题】长按 ListView 项目的 Android onCreateContextMenu 致命异常【英文标题】:Android onCreateContextMenu Fatal Exception by longclick on ListView item 【发布时间】:2013-12-02 16:08:33 【问题描述】:

我尝试为我的列表视图创建上下文菜单,但是当我“长按”列表项时,应用程序关闭并显示此跟踪:

FATAL EXCEPTION: main
java.lang.NullPointerException
at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onCreateActionMode(PhoneWindow.java:2445)
at com.android.internal.app.ActionBarImpl$ActionModeImpl.dispatchOnCreate(ActionBarImpl.java:708)
at com.android.internal.app.ActionBarImpl.startActionMode(ActionBarImpl.java:392)
at android.app.Activity.onWindowStartingActionMode(Activity.java:4380)
at com.android.internal.policy.impl.PhoneWindow$DecorView.startActionMode(PhoneWindow.java:2151)
at com.android.internal.policy.impl.PhoneWindow$DecorView.startActionModeForChild(PhoneWindow.java:2138)
at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:573)
at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:573)
at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:573)
at android.view.View.startActionMode(View.java:3558)
at android.widget.AbsListView.performLongPress(AbsListView.java:2570)
at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:2530)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

我浏览了许多示例和教程,但找不到决定。 Android API 14。

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    linkButton = (Button) findViewById(R.id.link_button);
    debugTxt = (TextView) findViewById(R.id.debugText);     
    lv = (ListView) this.findViewById(R.id.filelist);

    registerForContextMenu(lv);

    linkButton.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View v) 
            onClickLink();
        
    );

    mDbxAcctMgr = DbxAccountManager.getInstance(getApplicationContext(), appKey, appSecret);


@Override
protected void onResume() 
    super.onResume();
    if (mDbxAcctMgr.hasLinkedAccount()) 
        showLinkedView();
        doDropboxTest();
     else 
        showUnlinkedView();
    


private void onClickLink() 
    mDbxAcctMgr.startLink((Activity)this, REQUEST_LINK_TO_DBX);


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (requestCode == REQUEST_LINK_TO_DBX) 
        if (resultCode == Activity.RESULT_OK) 
            doDropboxTest();
         else 
            debugTxt.setText("Link to Dropbox failed or was cancelled.");
        
     else 
        super.onActivityResult(requestCode, resultCode, data);
    


private void doDropboxTest() 

try 
        // Create DbxFileSystem for synchronized file access.
        DbxFileSystem dbxFs = DbxFileSystem.forAccount(mDbxAcctMgr.getLinkedAccount());
        items = new ArrayList<String>();

        // Print the contents of the root folder.  This will block until we can
        // sync metadata the first time.
        List<DbxFileInfo> infos = dbxFs.listFolder(DbxPath.ROOT);
        debugTxt.setText("Contents of app folder:\n");

        for (DbxFileInfo info : infos) 
            info.path.toString();
            if (info.isFolder) 
                items.add(info.path.getName() + "/");
             else 
                items.add(info.path.getName());
                           
                               

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,   android.R.layout.simple_list_item_1, items);

        lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        //lv.setLongClickable(true);
        lv.setAdapter(adapter);   

     catch (IOException e) 
        debugTxt.setText("Dropbox test failed: " + e);
    




<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/edit"
    android:title="@string/edit" />
<item
    android:id="@+id/remove"
    android:title="@string/remove" />
<item
    android:id="@+id/change"
    android:title="@string/change" />

</menu>

谢谢帮助!

【问题讨论】:

【参考方案1】:

当您使用registerForContextMenu() 为上下文菜单注册视图时,活动将设置为接收onCreateContextMenu() 调用。移除lv.setOnCreateContextMenuListener() 调用,并将onCreateContextMenu() 方法移至Activity。

@Override
protected void onCreate(Bundle savedInstanceState)

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    linkButton = (Button) findViewById(R.id.link_button);
    debugTxt = (TextView) findViewById(R.id.debugText);
    lv = (ListView) this.findViewById(R.id.filelist);

    registerForContextMenu(lv);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    lv.setAdapter(adapter);

    linkButton.setOnClickListener(new OnClickListener()
     
        @Override
        public void onClick(View v) 
        
            onClickLink();
        
    );

    mDbxAcctMgr = DbxAccountManager.getInstance(getApplicationContext(), appKey, appSecret);


@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
 //here u set u rute
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.login, menu);

另外,当你为上下文菜单注册了 lv 时,你不需要调用lv.setLongClickable()

【讨论】:

谢谢回答!我尝试使用您的选项,但它不起作用。我也有同样的异常。 在您发布的代码中,...之间的块在哪里发生? (因为我不确定,所以我把它卡在了 onCreate() 中。) 我添加了一个完整的方法,我使用列表视图对象。 doDropboxTest() 什么时候被调用?请同时发布您的 res/menu/login.xml。 尝试注释掉这一行: lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);看看会发生什么。【参考方案2】:

结帐你给了

android:choiceMode="multipleChoiceModal"

而不是

android:choiceMode="multipleChoice"

这是我犯的错误。

【讨论】:

【参考方案3】:

如果 ListView 出现此问题,并且您使用 mlistView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL)。

您应该设置该选择模式:mlistView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) - 这对我有帮助。

【讨论】:

以上是关于长按 ListView 项目的 Android onCreateContextMenu 致命异常的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何在listView上的项目中结合滑动手势和长按

转android: 长按删除listview的item

android studio listview长按删除

android的ListView中如何设置长按Item的时候该Item背景变色

长按开始选择 ListView 中的项目?

android Fragment下的listview 怎么样可以设置单击事件和长按事件