2

В основном я 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

+0

Не называйте свои фрагменты как действия. Это так двусмысленно! Ваш BoardActivity и PhrasesActivity - это фрагменты, не так ли? – colriot

+0

Что такое 'R.id.tab_phrases'? Он определен? Опубликовать связанные XML тоже. – colriot

+0

его великие и ребята ответили так быстро спасибо. Названные Activites - это всего лишь мои идентификаторы, я знаю, что он неоднозначный, и я его изменю. – clementiano

ответ

0

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

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