onClick里面的片段给我NPE

时间:2013-01-22 21:53:21

标签: android android-layout android-fragments android-viewpager onclicklistener

我现在已经和摔跤了很长一段时间了。

我从使用常规活动切换到现在使用片段(按用户推荐),但我遇到了同样的问题。

我有3个页面,现在是ViewPager中的3个片段。我想在addSite片段中使用id为addSiteButton的按钮;单击时,滚动到setCurrentItem(2)。

任何帮助表示赞赏!这是我的代码。

FragmentActivity

public class fieldsActivity extends FragmentActivity {


private static final int NUMBER_OF_PAGES = 3;

ViewPager mPager;
MyFragmentPagerAdapter mMyFragmentPagerAdapter;


/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // to create a custom title bar for activity window
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.fields);
    // use custom layout title bar
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);

    mPager = (ViewPager) findViewById(R.id.fieldspager);
    mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mMyFragmentPagerAdapter);
    mPager.setCurrentItem(1);


}


private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int page) {

        switch (page) {

            case 0: return new settingFields();

            case 1: return new addSite();

            case 2: return new createSite();

        }

       return null;


    }

    @Override
    public int getCount() {

        return NUMBER_OF_PAGES;
    }

}

带按钮的课程

public class addSite extends Fragment {


public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    if (container == null) {
        return null;
    }

    RelativeLayout mRelativeLayout = (RelativeLayout) inflater.inflate(R.layout.add_site, container, false);
    final ViewPager mPager = (ViewPager) mRelativeLayout.findViewById(R.id.fieldspager);
    Button addSiteButton = (Button) mRelativeLayout.findViewById(R.id.addSiteButton);
    addSiteButton.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View view) {

            mPager.setCurrentItem(2, true);

        }
    });

   return mRelativeLayout;

}
}

我觉得我是在圈子里而没有得到想要的动作。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

只需将Fragment作为FragmentActivity中的一个类,并在onCreateView()中取出变量阴影,因为你的寻呼机是一个全局变量。

public class fieldsActivity extends FragmentActivity {


  private static final int NUMBER_OF_PAGES = 3;

  ViewPager mPager;
  MyFragmentPagerAdapter mMyFragmentPagerAdapter;


  /**
   * Called when the activity is first created.
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // to create a custom title bar for activity window
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.fields);
    // use custom layout title bar
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);

    mPager = (ViewPager) findViewById(R.id.fieldspager);
    mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mMyFragmentPagerAdapter);
    mPager.setCurrentItem(1);


  }

  public static class addSite extends Fragment {


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

      RelativeLayout mRelativeLayout = (RelativeLayout) inflater.inflate(R.layout.add_site, container, false);
      //final ViewPager mPager = (ViewPager) mRelativeLayout.findViewById(R.id.fieldspager);
      Button addSiteButton = (Button) mRelativeLayout.findViewById(R.id.addSiteButton);
      addSiteButton.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View view) {

        mPager.setCurrentItem(2, true);

        }
      });

      return mRelativeLayout;

    }
  }
}

每当您覆盖某个方法时,还要考虑使用@Override注释,这样您就不会犯错并使用正确的命名约定。 Java类以大写字母开头。