Android菜单操作栏:为什么其中一个元素没有收听点击?

时间:2013-01-22 20:15:19

标签: android menu menuitem

我有一个FragmentActivity类,带有一个2选项menú,它继承自超类,用于代码重用。

在这个FragmentActivity中,我添加了第三个菜单项,并将onOptionsItemSelected设置为我想要的Share菜单项(第三个获取自己的onMenuItemClick监听器)。但是,当我运行应用程序时,第二个和第三个选项(一个导致菜单和新选项)确实注册了点击并执行了他们被告知的内容,但第二个选项(一个设置为调用共享意图)却没有。点击它什么都不做。

这是我的菜单xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:id="@+id/ab_comparte"
    android:icon="@android:drawable/ic_menu_share"
    android:showAsAction="always|withText"
    android:title="@string/menu_share" 
    android:menuCategory="container" 
    android:orderInCategory="1"
    android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
    />
<item
    android:id="@+id/ab_menu"
    android:icon="@drawable/ic_action_bar_menu"
    android:showAsAction="always|withText"
    android:title="@string/menu_menu" 
    android:menuCategory="container" 
    android:orderInCategory="2"/>

</menu>

这是片段活动(仅与菜单相关的位)

public boolean onCreateOptionsMenu(Menu menu) {
    /*
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.menu_detalle_tapa, (Menu) menu);
    */
    menu.add("Me Gusta")
        .setOnMenuItemClickListener(this)
        .setIcon(R.drawable.like_blanco)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    return super.onCreateOptionsMenu(menu);
}
.....
@Override
public boolean onMenuItemClick(MenuItem item) {
    Crouton.makeText(this, "ME GUSTA", Style.ALERT).show();
    return false;
}
...................
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int itemId = item.getItemId();

    Log.d(CData.LOGTAG, "pulsado en menú item " + itemId);
    if (itemId == R.id.ab_comparte){
        // cerrar sesión
        Log.d(CData.LOGTAG, "pulsado en menú item Comparte" + itemId);
        Crouton.makeText(this, "ahora se abriría el menú de compartir ", Style.INFO).show();
        Intent i=new Intent(android.content.Intent.ACTION_SEND);

        i.setType("text/plain");
        /*i.putExtra(Intent.EXTRA_SUBJECT,
                    Tappabook.getAppContext().getResources().getString(R.string.asunto_compartir_tapa)
                );*/
        String en = Tappabook.getAppContext().getResources().getString(R.string.en);
        String comparteTapa = 
                tapaDetallada.getNombre() + " " 
                        + " " + en + " " 
                        + tapaDetallada.getBarNombre() + " "
                        + CData.urlCompartirTapa + tapaDetallada.getId()
                        ;

        i.putExtra(Intent.EXTRA_TEXT,comparteTapa);

        startActivity(
                Intent.createChooser(
                        i, 
                        Tappabook.getAppContext().
                        getResources().getString(R.string.titulo_compartir_tapa)
                        )
                );
        return true;
    }else{
        Log.d(CData.LOGTAG, "pulsado en menú item " + itemId);
        return super.onOptionsItemSelected(item);
    }
}

这是超类菜单相关位

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.menu_activity_login, menu);
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int itemId = item.getItemId();
    if (itemId == R.id.ab_menu){
        // cerrar sesión
        Log.d(CData.LOGTAG, "pulsado en menú item Menú" + itemId);

        Intent intent = new Intent(this, MenuFA.class);
        //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        return true;
    }else{
            Log.d(CData.LOGTAG, "pulsado en menú item " + itemId);
            return super.onOptionsItemSelected(item);
    }
}

那么我做错了什么?选项ab_menu可以正常工作。选项“Me gusta”(有自己的听众)也有效。但是选项ab_comparte虽然出现在操作栏上,却甚至都没有“听”点击。

任何帮助将不胜感激。

更新: 我在共享项的xml上更改了这个

android:showAsAction="collapseActionView|always"

现在,当我点击共享菜单项时,操作栏会更改,并显示另一个带有(不同)共享图标的项目。如果我点击这个第二个共享项目它确实有效,它会调用Share Intent。但是,我不想这样做。只需点击第一项就可以调用Share Intent,而不是更改操作栏以显示第二个共享项....我做错了什么?

1 个答案:

答案 0 :(得分:0)

好的,所以我已经开始工作了。似乎我在Activity中遗漏了一些代码,即:

这里我给菜单充气

    @Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.menu_detalle_tapa, (Menu) menu);
    MenuItem item = menu.findItem(R.id.ab_comparte);
    mShareActionProvider = (ShareActionProvider) item.getActionProvider();

    this.menu = menu;
    return true;
}

当我已经获得远程数据时会发生这种情况(因此您无法尝试共享空值/空对象

            /** Getting the target intent */
        Intent intent = getDefaultShareIntent();
        Log.d(CData.LOGTAG, "check if intent is null ");
        /** Setting a share intent */
        if(intent!=null)
            mShareActionProvider.setShareIntent(intent);
        else
            Log.d(CData.LOGTAG, "intent was null ");

这是我决定要分享什么的地方

private Intent getDefaultShareIntent(){

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    //intent.putExtra(Intent.EXTRA_SUBJECT, "SUBJECT");
    String en = Tappabook.getAppContext().getResources().getString(R.string.en);
    String comparteTapa = 
            tapaDetallada.getNombre() + " " 
                    + " " + en + " " 
                    + tapaDetallada.getBarNombre() + " "
                    + CData.urlCompartirTapa + tapaDetallada.getId()
                    ;
    intent.putExtra(Intent.EXTRA_TEXT,comparteTapa);
    return intent;
}

原来我是个白痴:P