Я следую примеру FragmentTabsPager под образцы из ActionBarSherlock.

В моем случае, я создал простой SherlockActivity с TabsPager и тот же код из примера для FragmentPagerAdapter.

Я создал два фрагмента (разных классов). Первый содержит всего четыре кнопки. Depending of which one is clicked, the main Activity gets a code (e.g. 1,2,3,4). Я правильно получить код нажатой кнопки.

Сейчас, во втором фрагменте я хочу нарисовать что-нибудь в зависимости от этого кода, или, что то же самое, динамически обновлять ее мнению.

Я искал решение, но я пока не знаю ничего. In this case I have this:

[MainActivity.java]

      public static class TabsAdapter extends FragmentPagerAdapter
            implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {

private final Context mContext;
        private final TabHost mTabHost;
        private final ViewPager mViewPager;
        private final ArrayList mTabs = new ArrayList();    
[...]
    @Override
        public Fragment getItem(int position) {
            TabInfo info = mTabs.get(position);
            return Fragment.instantiate(mContext, info.clss.getName(), info.args);

    }

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

Возможно ли это?

Заранее спасибо.

UPDATE

Наконец, я использовал то, что Солнечный любезно объяснили. Я держал SparseArray с моим Фрагменты, чтобы я мог наверняка получить к ним доступ, как я знаю его позицию внутри файл mainactivity:

[MainActivity.java]

    //Once the user presses the button on the first fragment, the callback calls
// this function
    public void onImageSelected(int iNumber){

    MySecondFragment msf = (MySecondFragment)mTabsAdapter.getFragment(POS_1);

        if(msf != null){

                msf.setNumImage(iNumber);               
                msf.updateView();                                   
            }                   
       }

И, наконец, в MySecondFragment.java я могу открыть мой макет компоненты (например, элемент управления gridview), как они были инициализированы во время onCreateView, поэтому я поместил весь код, мне нужно внутрь моей updateView() метод.

Например, я обновить содержимое gridview в:

[MySecondFragment.java]

myGridView.setBackground(getResources().getDrawable(iCode));

HTH

UPDATE 2

Я включил следующий код для того, чтобы сохранить фрагменты в государственный пучок основным видом деятельности. Когда приложение изменяется с книжной на альбомную или наоборот (он создается заново) функция getItem не называясь, поэтому SparseArray карта не доливали снова с необходимые Фрагменты:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putString(CURRENT_TAB, mTabHost.getCurrentTabTag());

        getSupportFragmentManager().putFragment(outState, MyFirstFragment.class.getName(), mTabsAdapter.getFragment(POS_1));

        getSupportFragmentManager().putFragment(outState, MySecondFragment.class.getName(),
                mTabsAdapter.getFragment(POS_2));
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        if (savedInstanceState != null) {

            MyFirstFragment mff = (MyFirstFragment) getSupportFragmentManager().getFragment(savedInstanceState, MyFirstFragment.class.getName());                           

            if(mff != null)
                mTabsAdapter.setFragment(POS_1, mff);

            MySecondFragment msf = (MySecondFragment) getSupportFragmentManager().getFragment(
                    savedInstanceState, MySecondFragment.class.getName());                          

            if(msf != null)
                mTabsAdapter.setFragment(POS_2, msf);

            mTabHost.setCurrentTabByTag(savedInstanceState
                    .getString(CURRENT_TAB));           
        }
    }

Также, внутри TabsAdapter класс:

public Fragment getFragment(int pos) {
    return map.get(pos);
}

public void setFragment (int position, Fragment fragment) {
     map.put(position, fragment);
}

HTH

share|improve this question

2 Answers 2

up vote 1 down vote accepted

anhanniballake ответ может сработать. Но это может сломать в будущем.

На самом деле получить фрагмента можно определить sparesArray в TabAdapter класс

private SparseArray map;

и добавить свои фрагменты в этом массиве

@Override
public Fragment getItem(int position) {
    TabInfo info = mTabs.get(position);
    Fragment fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args);
    map.put(position, fragment);
    return fragment;
}

Вам также потребуется удалить фрагмент из карты фрагмент, когда разобьешь

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    map.remove(position);
    super.destroyItem(container, position, object);
}

Теперь определяем публичный метод в классе TabAdapter которые можно получить Фрагменты

public Fragment getFragment(int pos) {
    return map.get(pos);
}

Теперь в Вашей основной SherlockFragementActivity вы можете получить экземпляр любого фрагмента

MyFragment f = (MyFragment) mTabsAdapter.getFragment(1); // 1 means second fragment from left

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

f.doAnyThingInMySecondFragment();

doAnyThingInMySecondFragment must be declared public :)

share|improve this answer
1  
When I change the orientation of the device neither destroyItem nor getItem are being called, so the Fragment SparseArray is not refilled again when the Activity is re-created. I also tried with FragmentStatePagerAdapter with no luck. What could I do? – aloplop85 Apr 19 '13 at 12:31
    
when your device is rotated your MainSherlockActvity's onCreate method gets called and in onCreate method your tabAdapter get initialized again. So your sparesArray should not be null. and you should use 'FragmentStatePagerAdapter'. – Sunny Apr 19 '13 at 19:00
    
The tabAdapter is initialized correctly and SparseArray is not null. However, as getItem is not being called again, the Fragments are not included in that array (i.e. SparseArray size is 0). – aloplop85 Apr 22 '13 at 8:13
    
I adapted the solution included here: stackoverflow.com/questions/7951730/… – aloplop85 Apr 22 '13 at 9:38

The source for FragmentPagerAdapter shows that Fragments are given the following tag:

"android:switcher:" + viewId + ":" + id;

Where viewId is the R.id of your ViewPager and id is the page number.

Therefore you can retrieve the second page's Fragment by using:

activity.getSupportFragmentManager().findFragmentByTag(
    "android:switcher:" + pager.getId() + ":2")

Where pager is your ViewPager. You'd then want to cast that returned Fragment to whatever specific class you have, then call a method to pass in the information you need.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.