0

私の質問はfragment 内の Android setShareIntent に似ていますが、そこでの回答を読んで、それらを自分の状況に適用する方法がわかりませんでした。

私の質問の簡単な要約

フラグメントが変更されるたびに、つまり新しいフラグメントがユーザーに表示されるたびに、ShareIntent を設定したいと思います。どうやってやるの?setShareIntent 呼び出しはどこに行くべきですか?

コード スニペット付きのロング バージョン

これが私のコードのスケルトンです:

import android.support.v7.widget.ShareActionProvider;

public class SolvePuzzle extends ActionBarActivity {
    private ShareActionProvider mShareActionProvider;
    static AppSectionsPagerAdapter mAppSectionsPagerAdapter;
    static ViewPager mViewPager;

    ...

    public void onCreate(Bundle savedInstanceState) {

        ...

        mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);
    }
}

それから来る

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.solve_puzzle, menu);
        MenuItem item = menu.findItem(R.id.menu_item_share);

        mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
        if (mShareActionProvider == null) {
            // Following https://stackoverflow.com/questions/19358510/why-menuitemcompat-getactionprovider-returns-null
            mShareActionProvider = new ShareActionProvider(this);
            MenuItemCompat.setActionProvider(item, mShareActionProvider);

            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.putExtra(Intent.EXTRA_TEXT, "Some text");  // For debugging
            shareIntent.setType("text/plain");
            setShareIntent(shareIntent);

            Log.d(DEBUG_TAG, "Called new mShareActionProvider(this) and set share intent");
        }
        return true;
    }

    private void setShareIntent(Intent shareIntent) {
        // Want to call this whenever new puzzle fragment is displayed
        if (mShareActionProvider != null) {
            mShareActionProvider.setShareIntent(shareIntent);
        } else {
            Log.d(DEBUG_TAG, "Could not set share intent:  mShareActionProvider == null");
        }
    }

私はそれから と を持っていpublic class AppSectionsPagerAdapter extends FragmentPagerAdapterますpublic class SolvePuzzleFragment extends Fragment implements OnClickListener

現在、SolvePuzzleFragment の onCreateView で setShareIntent を呼び出しています。

これは機能しません: logcat を見ると、フラグメントからの setShareIntent 呼び出し (最初の 2 行) が、SolvePuzzle クラスからの onCreateOptionsMenu 呼び出し (最後の行) の前に発生していることがわかります。

12-12 12:39:26.505: D/Debug(3864): 共有インテントを設定できませんでした: mShareActionProvider == null

12-12 12:39:26.515: D/Debug(3864): 共有インテントを設定できませんでした: mShareActionProvider == null

12-12 12:39:26.565: D/Debug(3864): 新しい mShareActionProvider(this) を呼び出し、共有インテントを設定

...そして、フラグメントから 2 つの呼び出しがあるようです。これは、最初のフラグメントのみが表示されているにもかかわらず、現在のフラグメントと次のフラグメントの両方が作成されている (onCreateView が呼び出されている) ためですか?

フラグメントの onCreateView で setShareIntent を呼び出すのは間違いのようです。私がやりたいことは、新しいフラグメントがユーザーに表示されたときに setShareIntent を呼び出すことです。それ、どうやったら出来るの?

編集:追加情報:

共有ボタンは現在機能していますが、onCreateOptionsMenu でデバッグ目的で設定した「テキスト」メッセージが送信されます。最初のフラグメントがユーザーに表示されるとすぐに、フラグメント関連のインテントによってそのインテントが上書きされるようにします (新しいフラグメントが表示されるたびに上書きされます)。

4

1 に答える 1