В основном я Fragment активностью который содержит два ListFragments и я использую ViewPager красть между them.In один фрагмент, когда я долго нажмите на listItem и выберите Add Phrase, он обновляет базу данных другого спискаFragment, но никогда не обновляется, пока я не закрою приложение и не открою его снова. Я попытался использовать официальный андроидный способ связи между фрагментом, используя интерфейс в спискеFragment и метод обратного вызова http://developer.android.com/training/basics/fragments/communicating.html. Это должно вызвать метод, который заполняет данные во втором ListFragment, но я всегда получаю исключение nullPionterException. Пожалуйста, помогите мнекак общаться между двумя listfragments в ViewPager от родительского fragmentactivity
Это первый ListFragment (BoardActivity.java, только ту часть, которая добавляет интерфейс)
//container activity must implement this interface
public interface OnAddPhraseListener {
public void onAddPhrase(String text);
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
//make sure that the container activity has implemented the callback interface
try{
mAddPhraseCallback = (OnAddPhraseListener) activity;
}catch(ClassCastException e){
}
}
Это второй ListFragment (PhrasesActivity.java, часть, которая заполняет d ListView с данными)
public void fillData(){
try {
mDbHelper = new PhrasesDbAdapter(this.getSherlockActivity()).open();
} catch (SQLException e) {
Log.e(tag, "Couldnt open mDbHelper to fill Data");
e.printStackTrace();
}
Cursor phraseCursor = mDbHelper.fetchAllPhrases();
String [] from = new String[]{PhrasesDbAdapter.KEY_PHRASE};
int [] to = new int []{R.id.phraseText};
SimpleCursorAdapter phrases = new SimpleCursorAdapter(getSherlockActivity(), R.layout.phrases_row, phraseCursor, from, to);
setListAdapter(phrases);
}
Это MainLayoutActivity, который держит ViewPager с BoardActivity и PhrasesActivity
public class MainLayoutActivity extends SherlockFragmentActivity implements OnAddPhraseListener {
public ViewPager mViewPager;
public ViewPagerAdapter mAdapter;
public com.actionbarsherlock.app.ActionBar mActionBar;
public Tab tab;
ComponentName service;
final String CLIP_CHANGED = "clipboard.clipchanged";
final String tag = "Clipboard";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
mActionBar = getSupportActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
setUpView();
setTab();
service = startService(new Intent(this, ClipboardService.class));
}
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getSupportMenuInflater().inflate(R.menu.menu_layout, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item){
switch (item.getItemId()) {
case R.id.menu_settings:
Intent intent = new Intent(this, ClipboardPrefereneActivity.class);
startActivity(intent);
return true;
case R.id.menu_about:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void setUpView(){
mViewPager = (ViewPager) findViewById(R.id.pager);
mAdapter = new ViewPagerAdapter(getApplicationContext(), getSupportFragmentManager());
mViewPager.setAdapter(mAdapter);
mViewPager.setCurrentItem(0);
}
private void setTab(){
mViewPager.setOnPageChangeListener(new OnPageChangeListener(){
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
});
ActionBar.TabListener tabListener = new ActionBar.TabListener() {
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
};
tab = mActionBar.newTab().setText("Board").setTabListener(tabListener);
mActionBar.addTab(tab);
tab = mActionBar.newTab().setText("Phrases").setTabListener(tabListener);
mActionBar.addTab(tab);
}
@Override
public void onAddPhrase(String text) {
Log.d(tag, "On Add Phrase callback >>>>>>>>>>>>");
PhrasesActivity phrasesActivity = (PhrasesActivity) getSupportFragmentManager().findFragmentById(R.id.tab_phrases);
if(phrasesActivity != null){
Log.e(tag, "Got Phrases Activity to fill Data");
phrasesActivity.fillData();
}
else{
Log.e(tag, "Couldnt get Phrases Activity to fill Data");
}
}
}
приложение всегда получает журнальное сообщение Log.e(tag, "Couldnt get Phrases Activity to fill Data");
Опять я прочитал о LocalBraodcastManager я могу сделать обновление с этим? это лучший способ? http://getpocket.com/a/read/156004495
Не называйте свои фрагменты как действия. Это так двусмысленно! Ваш BoardActivity и PhrasesActivity - это фрагменты, не так ли? – colriot
Что такое 'R.id.tab_phrases'? Он определен? Опубликовать связанные XML тоже. – colriot
его великие и ребята ответили так быстро спасибо. Названные Activites - это всего лишь мои идентификаторы, я знаю, что он неоднозначный, и я его изменю. – clementiano