【问题标题】:Overriding onContextItemSelected() in ActionBarSherlock在 ActionBarSherlock 中覆盖 onContextItemSelected()
【发布时间】:2013-02-18 12:13:37
【问题描述】:

我有一个扩展 SherlockActivity 的类,因为我在活动中使用了 ActionBarSherlock 操作栏。但是,我还尝试将上下文菜单添加到此活动中的列表视图,该活动在列表视图中的项目被长按时启动。我在onContextItemSelected(MenuItem item) 的声明中遇到错误,说我的覆盖无效,因为没有什么可以覆盖。但是,当我删除覆盖时,永远不会调用该函数。我知道这与 SherlockActivity 从 Activity 继承的方式有关,但我不确定具体情况。也许我错过了进口?在此处查看相关代码:

public class Inbox extends SherlockActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_inbox);
    refreshMsgs(this.getCurrentFocus());
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    if (v.getId() == R.id.lstInbox){
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        String contactName = lstConversation.get(info.position).getContactName();   
        menu.setHeaderTitle(contactName);
        menu.add(Menu.NONE, 0, 0, "View contact");
        menu.add(Menu.NONE, 1, 1, "Delete thread");
    }
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    SmsConversation selectedConvo = lstConversation.get(info.position);         

    if (item.getItemId() == 0){
        //view contact
        Intent viewcontactIntent = new Intent();
        String contactId = selectedConvo.getContactId();
        Uri uriContact = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, contactId);
        viewcontactIntent.setData(uriContact);
        PendingIntent pViewIntent = PendingIntent.getActivity(getBaseContext(), 1, viewcontactIntent, 0);
        try {
            pViewIntent.send();
        } catch (CanceledException e) {
            e.printStackTrace();
        }
    } else {
      //DELETE thread
    }
    return true;
}
}

以下是我为该课程导入的所有内容:

import java.util.ArrayList;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.MenuInflater;

import android.app.Activity;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.Html;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

【问题讨论】:

    标签: android actionbarsherlock


    【解决方案1】:

    很久以前遇到过类似的问题,我通过使用其完全限定的类名 (android.view.MenuItem) 强制使用普通的 MenuItem 来覆盖 onContextItemSelected(),如下所示:

    @Override
    public boolean onContextItemSelected (android.view.MenuItem item)
    {
      //implementation
    }
    

    【讨论】:

    • 是的!它们使用两个不同的MenuItem 类,因此其中一个方法签名必须使用完全限定的类名。
    • @JakeWharton 很高兴看到您正在积极检查 ABS 标签!你有没有机会告诉我们为什么这个方法没有被 ABS 实现?我找到了this讨论,但你只是提到需要使用完全限定名称。
    • 自 API 1 以来就一直存在,并且没有真正的功能更改供 ABS 实施。回想起来,我可能应该将 ABS MenuItem 命名为 SherlockMenuItem 以避免出现此类问题。
    • @JakeWharton 这是有道理的。谢谢你的解释!
    • @A--C 谢谢,解决了。我有一种感觉是这样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多