java - 如何在父 fragment Activity 的 viewpager 中的两个列表 fragment 之间进行通信

标签 java android android-fragments android-viewpager android-listfragment

基本上,我有一个 fragment Activity ,它包含两个ListFragments,我使用ViewPager 在它们之间滑动。在一个 fragment 中,当我长按时在 listItem 上并选择添加短语,它会更新另一个 listFragment 的数据库,但在我关闭应用程序并重新打开它之前不会立即刷新。我尝试使用官方的 android fragment 之间的通信方式,使用 listFragment 中的接口(interface)和回调方法 http://developer.android.com/training/basics/fragments/communicating.html .这应该调用在第二个 ListFragment 中填充数据的方法,但我总是得到 nullPionterException。请帮助我

这是第一个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,它包含带有 BoardActivityPhrasesActivity 的 viewpager

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

最佳答案

不要在 ViewPager 场景中找到 FragmentByTag,因为标签由于自身原因无法获取。请改用 LocalBroadcastManager 在 fragment 之间进行通信。

关于java - 如何在父 fragment Activity 的 viewpager 中的两个列表 fragment 之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19273650/

相关文章:

Java网格布局调整

java - 在java中存储(UniqueString, String)

android - 6.0.1 搜索附近的蓝牙

android - 修复键盘打开时父 Activity 中的按钮位置

java - Android 应用程序在多次切换 fragment 时崩溃

android - viewpager 中的 3 个 android fragment ,如何让它们全部存活?

java - 方法无法解析为 Eclipse 中的变量

java - Mahout-用户推荐

android - 使用 Gson 序列化时忽略主键

android - SQLITE 查询强制应用程序关闭