【问题标题】:NullPointerException a call tag fragment ViewPagerNullPointerException 调用标签片段 ViewPager
【发布时间】:2013-12-17 15:35:19
【问题描述】:

需要帮助,尝试调用 Activity 的方法片段,我认为请求片段的标签不正确。

所以问标签:

public class TitleAdapter extends FragmentPagerAdapter {
public final String titles[] = new String[] { "A", "B", "C" };
public final Fragment frags[] = new Fragment[titles.length];



public TitleAdapter(FragmentManager fm) {
    super(fm);
    frags[0] = new FragmentA();
    fm.beginTransaction().add(frags[0], "fragA").commit();
    frags[1] = new FragmentB();
    fm.beginTransaction().add(frags[1], "fragB").commit();
    frags[2] = new FragmentC();
    fm.beginTransaction().add(frags[2], "fragC").commit();
}



@Override
public CharSequence getPageTitle(int position) {
    Log.v("TitleAdapter - getPageTitle=", titles[position]);
    return titles[position];
}


@Override
public Fragment getItem(int position) {

    Log.v("TitleAdapter - getItem=", String.valueOf(position));
    return frags[position];
}


@Override
public int getCount() {
    return frags.length;
}

}

感觉正确导致 onCreate(Bundle savedInstanceState)

public class MainActivity extends FragmentActivity {

TitleAdapter titleAdapter;

ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mViewPager = (ViewPager) findViewById(R.id.pager);

    TitleAdapter titleAdapter = new TitleAdapter(getSupportFragmentManager());
    mViewPager.setAdapter(titleAdapter);
    mViewPager.setCurrentItem(1);
    mViewPager.setOffscreenPageLimit(2);


    FragmentManager fm = getSupportFragmentManager();



    FragmentA fragment = (FragmentA)fm.findFragmentByTag("fragA");
    fragment.bgStop();

这里是方法本身

public class FragmentA extends Fragment {

  final static String LOG_TAG = "myLogs";  
  static Button btnPlay;


    public FragmentA() {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_a, container, false);

        btnPlay = (Button) rootView.findViewById(R.id.btnStart);




        return rootView;
    }





    public void bgPlay(){
               btnPlay.setText("Play");
           btnPlay.setBackgroundResource(R.drawable.play_button);
    }

    public void bgStop(){
               btnPlay.setText("Stop");
       btnPlay.setBackgroundResource(R.drawable.stop_button);
    }

}

【问题讨论】:

  • 您已经定义了两次 TitleAdapter titleAdapter 参考。删除其中任何一个。
  • 你对这两条记录有兴趣吗? TitleAdapter titleAdapter = new TitleAdapter(getSupportFragmentManager());和 FragmentManager fm = getSupportFragmentManager();
  • 主要活动后没有。以及在哪里得到 NUll 指针异常。?
  • Fragment.bgStop()上MainActivity中的空指针异常;
  • 你能显示我在哪里调用了两次titleAdapter吗?我无法理解。

标签: android android-fragments android-viewpager


【解决方案1】:

该代码存在很多问题。在这里,让我为你解决这个问题。 以下内容未经测试,仅在我最喜欢的文本编辑器中编辑。

public class TitleAdapter extends FragmentPagerAdapter {
    public final String titles[] = new String[] { "A", "B", "C" };
    public final Fragment frags[] = new Fragment[titles.length];

    public TitleAdapter(FragmentManager fm) {
        super(fm);
        // do not commit any fragments here, the adapter handles that.
        frags[0] = new FragmentA();
        frags[1] = new FragmentB();
        frags[2] = new FragmentC();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Log.v("TitleAdapter - getPageTitle=", titles[position]);
        return titles[position];
    }

    @Override
    public Fragment getItem(int position) {

        Log.v("TitleAdapter - getItem=", String.valueOf(position));
        return frags[position];
    }

    @Override
    public int getCount() {
        return frags.length;
    }

}

然后在活动中:

public class MainActivity extends FragmentActivity {
    TitleAdapter titleAdapter;
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mViewPager = (ViewPager) findViewById(R.id.pager);

        final TitleAdapter titleAdapter = new TitleAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(titleAdapter);
        mViewPager.setCurrentItem(1);
        mViewPager.setOffscreenPageLimit(2);
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                Fragment fragment = titleAdapter.getItem(position);
                // Ideally use some sort of interface here.
                if (fragment instanceof FragmentA) {
                    ((FragmentA) fragment).bgStop();
                }
            }
        });
    }
}

【讨论】:

  • 它可以工作,谢谢,但解决了下一个问题,我把它戴上并在点击后按下按钮,当浏览片段下降错误 java.lang.NullPointerException 指向此代码 Fragment fragment = titleAdapter.getItem (位置);我该如何解决?或者您提供“理想情况下在这里使用某种界面”。怎么办?
  • 不太确定你想在这里实现什么,但我提到的接口是你的片段应该implements MyCommonFragmentInterface 这是一个接口,它有一些在三个接口之间通用的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2012-11-17
  • 2016-04-24
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
相关资源
最近更新 更多