Вопрос по android-viewpager, android – Android setShareIntent внутри фрагмента

1

1. Background

У меня есть экран, который имеет

ShareActionProvider

и

ViewPager

который использует фрагменты.

То, что я надеялся сделать, это получить некоторую информацию из видимого в данный момент фрагмента для создания намерения, тогда я смог бы установить намерение на ShareActionProvider.

Вот код, который я использую, чтобы установить намерение ShareActionProvider:

    MenuItem actionItem = men.getMenu().findItem(R.id.menu_item_share_action_provider_action_bar);
    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
    actionProvider.setShareIntent(createShareIntent(mProduct.mProduct));

Я пытался использовать это в нескольких местах, например, в этих функциях класса Fragment:

onCreateView
onStart

Я также попытался использовать его в этих функциях в классе FragmentPagerAdapter:

getItem

2. The Problem

Хотя намерение фактически устанавливается в ShareActionProvider, полученная информация относится к следующему фрагменту (тот, который в данный момент не отображается). Например:

Если у меня есть 4 фрагмента: frag1, frag2, frag3, frag4 и я сейчас просматриваю & quot; frag1 & quot; ShareActionProvider попытается поделиться «frag2». Это верно до тех пор, пока не достигнет «frag4» где он будет делить правильное значение.

Я предполагаю, что фрагментный пейджер создает текущий вид и следующий вид (скрытый), который, в свою очередь, устанавливает ShareActionProvider. Если это так, то где находится правильное место для «setShareIntent»?

Ваш Ответ

3   ответа
1

как это сделать самому. То, что я в итоге сделал, это переопределение

OnPageChangeListener

в фрагментарности

private final OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener() {

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPageSelected(int arg0) {
        // TODO Auto-generated method stub
        TestFragment frag = (TestFragment) adapter.mFragments.get(pager.getCurrentItem());

        frag.setShareActionIntent();

    }

};
Извините, что не вернулся раньше, я был в отпуске! у вас все еще есть проблемы с этим? Ваш вопрос, кажется, больше не существует! kiwijus
Спасибо, что вернулся ко мне. Я удалил вопрос по какой-то причине, которую я сейчас забыл. Во всяком случае, у меня все работает как надо ... как бы то ни было: P
Я уже сделал то же самое, но у меня все еще есть проблема. Мое приложение делится фотографиями. И я копирую файл jpeg куда-нибудь, чтобы поделиться им. Копировать его каждый раз, когда viewpager изменился, не очень хороший способ. Как я могу сделать это только тогда, когда пользователь действительно нажимает кнопку поделиться.
У меня также есть некоторые проблемы с Fragments и ShareActionProvider. Не могли бы вы поделиться своим методом setShareActionIntent ()? Вот моя проблема:stackoverflow.com/questions/12085905/…
Вы не должны хранить ссылки на свои фрагменты в адаптере, так как они обычно используются повторно
4

Я натыкаюсь на этот вопрос, имея дело с подобной проблемой. 2 вещи о принятом решении:

  1. Don't save reference to the fragment anywhere, especially in some list in the adapter
  2. Don't create fields in the fragment, always store data you need in the Bundle so you can get it by using Fragment#getArguments

Теперь, учитывая это, вот простое решение: поместите код инициализации ShareActionProvider вonPrepareOptionsMenu вызов. Что-то вроде этого:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    MenuItem menuShare = menu.findItem(R.id.menuShare);
    ShareActionProvider shareAction = (ShareActionProvider) 
         menuShare.getActionProvider();
    shareAction.setShareIntent(createShareIntent());
}

protected Intent createShareIntent() {
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    Job job = getArguments().getSerializable(JOB);
    shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, job.title);
    shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, job.toText());
    return shareIntent;
}
Как я могу поделиться изображением с помощью общего намерения во фрагменте?
0

http://developer.android.com/reference/android/widget/ShareActionProvider.html

Пример из Android SDK док:

  // In Activity#onCreateOptionsMenu
  public boolean onCreateOptionsMenu(Menu menu) {
      // Get the menu item.
      MenuItem menuItem = menu.findItem(R.id.my_menu_item);
      // Get the provider and hold onto it to set/change the share intent.
      mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
      // Set history different from the default before getting the action
      // view since a call to MenuItem.getActionView() calls
      // onCreateActionView() which uses the backing file name. Omit this
      // line if using the default share history file is desired.
      mShareActionProvider.setShareHistoryFileName("custom_share_history.xml");
      . . .
  }

  // Somewhere in the application.
  public void doShare(Intent shareIntent) {
      // When you want to share set the share intent.
      mShareActionProvider.setShareIntent(shareIntent);
  }
Это именно то, что я делаю, но я не знаю, где установить намерение получить правильное значение kiwijus

Похожие вопросы