0

コードを再利用する目的で、スーパークラスから継承された 2 つのオプション メニューを持つ FragmentActivity クラスがあります。

この FragmentActivity に 3 番目のメニュー項目を追加し、onOptionsItemSelected を設定して、Share メニュー項目に必要な処理を行います (3 番目の項目は独自の onMenuItemClick リスナーを取得します)。ただし、アプリを実行すると、2 番目と 3 番目のオプション (メニューと新しいオプションにつながるもの) はクリックを登録し、指示されたとおりに実行しますが、2 番目のオプション (共有インテントを呼び出すように設定されたもの) はしません。タップしても何も起こりません。

これは私のメニュー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 アクティビティです (メニュー関連のビットのみ)

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"

ここで、共有メニュー項目をクリックすると、アクションバーが変化し、(別の) 共有アイコンが付いた別の項目が表示されます。この 2 番目の共有アイテムをクリックすると、機能し、Share Intent が呼び出されます。ただし、これを行う必要はありません。最初のアイテムをクリックするだけで共有インテントが呼び出され、アクションバーを変更して2番目の共有アイテムを表示する必要はありません....何が間違っていますか?

4

1 に答える 1

0

わかりましたので、私はすでにそれを機能させました。アクティビティにいくつかのコードが欠けていたようです。つまり、次のとおりです。

ここでメニューを膨らませます

    @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;
}

このビットは、すでにリモート データを取得しているときに発生します (そのため、null/空のオブジェクトを共有しようとすることはできません)

            /** 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

于 2013-01-25T11:10:34.883 に答える