【问题标题】:Android Menu Action Bar: why doesn't one of the elements listen to the clicks?Android菜单操作栏:为什么其中一个元素不听点击?
【发布时间】:2013-01-22 20:15:18
【问题描述】:

我有一个 FragmentActivity 类,其中包含从超类继承的 2 选项菜单,用于代码重用。

在这个 FragmentActivity 中,我添加了第三个菜单项并将 onOptionsItemSelected 设置为对共享菜单项执行我想要的操作(第三个有自己的 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>

这是 Fragment Activity(仅与菜单相关的位)

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"

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

【问题讨论】:

    标签: android menu menuitem


    【解决方案1】:

    好的,所以我已经让它工作了。看来我在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      相关资源
      最近更新 更多