2012-09-09 3 views
3

Я новичок в разработке Android, и я был бы очень признателен за помощь здесь.Обновление фрагментов из Activity в ViewPager

Я использую фрагмент, который содержит TextView, и я использую 5 экземпляров одного и того же класса MyFragment.

В этой операции у меня есть кнопка и ViewPager, и мне нужна кнопка для обновления содержимого экземпляров фрагментов, всякий раз, когда его щелкают.

Вот активность

public class MainActivity extends FragmentActivity { 

final static String[] CONTENT = {"a", "b"}; 
ViewPager pager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    List<MyFragment> fragments = new Vector<MyFragment>(); 
    for(int i = 0; i < 5; i++){ 
     MyFragment fragment = new MyFragment(CONTENT); 
     fragments.add(fragment); 
    } 
    PagerAdapter adapter = new PagerAdapter(this.getSupportFragmentManager(), fragments); 
    pager = (ViewPager) findViewById(R.id.viewpager); 
    pager.setAdapter(adapter); 

    Button button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      //method that isn't working 
      PagerAdapter adapter = (PagerAdapter)pager.getAdapter(); 
      for(int i = 0; i < 5; i++){ 
       MyFragment fragment = (MyFragment) adapter.getItem(i); 
       fragment.textView.setText(fragment.content[1]); 
      } 
     } 
    }); 
} 
} 

Обломок

public class MyFragment extends Fragment{ 

String[] content; 
    TextView textView; 

public MyFragment(String[] content) { 
    this.content = content; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_content, container, false); 
    textView = (TextView) view.findViewById(R.id.textView1); 
    textView.setText(content[0]); 
    return view; 
} 

} 

И FragmentPagerAdapter

public class PagerAdapter extends FragmentPagerAdapter{ 

List<MyFragment> fragments; 

public PagerAdapter(FragmentManager fm, List<MyFragment> fragments) { 
    super(fm); 
    this.fragments = fragments; 
} 

@Override 
public Fragment getItem(int arg0) { 
    return fragments.get(arg0); 
} 

@Override 
public int getCount() { 
    return fragments.size(); 
} 

} 

Метод OnClick дает мне NullPointerException всякий раз, когда я пытаюсь получить доступ фрагмент из адаптера который меньше, чем adapter.getCurrentItem() - 1 или больше, чем адаптер .getCurrentItem() + 1.

Любая идея о том, как обновлять все фрагменты одновременно?

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

+0

Вы можете изменить текущий видимый и затем добавьте 'OnPageChangeListener' в' ViewPager' и обновите остальные дочерние фрагменты, когда пользователь проведет влево или вправо. – Luksprog

+1

Это работает очень хорошо.Я реализовал onPageSelected, но остается только одна проблема, которая возникает при запуске прокрутки между страницами, пока я не выпущу следующий фрагмент, который не обновляется. Хотя это можно решить с помощью onScrollStateChanged, но пока ничего. Любое предложение? – Helios

ответ

1

Самый простой способ обновить эти фрагменты - использовать свой код и установить количество фрагментов, которые ViewPager хранит в памяти, до количества полных фрагментов - 1 (так что все фрагменты действительны независимо от того, на какой странице вы находитесь) , В вашем случае:

pager.setOffscreenPageLimit(4); // you have 5 elements 

Вы все еще можете использовать метод из моего комментария с помощью метода onPageScrollStateChanged (так начнется обновление в тот момент, пользователь начинает Swiping), чтобы увидеть, когда пользователь начинает красть пейджер и обновление фрагменты влево и вправо от видимого в данный момент фрагмента, но это будет немного сложно, поэтому я рекомендую перейти к первому варианту.

Некоторые моменты, касающиеся вашего кода, содержащего фрагменты:

Если гнездо класс фрагмент сделать его статическим, так что вы не связать его с объектом деятельности. Не создавайте конструктор для Fragment, кроме стандартного. Если фрейму необходимо воссоздать фрагмент, он будет вызывать конструктор по умолчанию, а если он недоступен, он будет генерировать исключение. Например, попробуйте изменить ориентацию телефона/эмулятора и посмотреть, что произойдет (это один из случаев, когда Android воссоздает фрагменты). Наконец, используйте пользовательское имя для адаптера ViewPager, вы используете PagerAdapter, который является именем суперкласса FragmentViewPager, и это очень смущает кого-то, читающего ваш код.

Если вам нужно передать данные в Fragment вы могли бы использовать метод создания, как показано ниже:

public static MyFragment newInstance(String text) { 
     MyFragment f = new MyFragment(); 
     Bundle b = new Bundle(); 
     b.putString("content", text); 
     f.setArguments(b); 
     return f; 
    } 

Текст будет доступен в MyFragment с помощью getArguments().getString("content");

+0

Спасибо большое! Я исправлю эти проблемы. Кстати, ViewPager было просто произвольным именем, которое я дал моему фактическому классу для публикации здесь. В любом случае, спасибо, что указали это, я буду помнить об этом. Еще раз спасибо за все советы. – Helios

+0

У меня проблемы с теми же фрагментами. Не могли бы вы дать руку? Если я убью приложение с помощью adb, у меня получится ошибка, потому что f.getArguments возвращает null. Я попытался установить эти аргументы внутри onCreate, onActivityCreated и некоторых других мест, но они не сработали. Я понимаю, что мне нужно их установить, но на самом деле не знаю, где. Я был бы признателен – Helios

+0

@Helios Прежде всего, вы должны создать новый вопрос и разместить там соответствующие фрагменты кода. Я не совсем понимаю, что вы делаете, но если вы убьете приложение, вам нужно сохранить состояние фрагмента в нечто постоянное (база данных) или в «Bundle» (с 'onSaveInstanceState'). – Luksprog

Смежные вопросы