在按钮单击时将分段添加到寻呼机适配器

时间:2016-03-22 15:07:17

标签: java android

我有一个带有1个片段的标签式活动,这个片段有一个按钮,我想当我点击按钮它创建一个新片段时我可以在这两个片段之间滑动

这是主要活动

public class ActivityBeamRec extends AppCompatActivity {

    private SectionsPagerAdapter mSectionsPagerAdapter;

    public static CustomViewPager mViewPager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_beam_rec);

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        // Set up the ViewPager with the sections adapter.
        mViewPager = (CustomViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        mViewPager.setPagingEnabled(false);

            }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {
                       switch (position){
                case 0 : return PlaceholderFragment.newInstance(position + 1);
         //       case 1 : return the new fragment ;
            }
            return null;
        }

        @Override
        public int getCount() {

            return 1 ; 
        }

            }
}

这是我的片段。

public  class PlaceholderFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    public PlaceholderFragment() {
    }

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

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

        final EditText etxb;
     etxb = (EditText)rootView.findViewById(R.id.editText);
     final Button buDesign = (Button)rootView.findViewById(R.id.buDesign);

        buDesign.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    double b;          
    b = Double.valueOf(etxb.getText().toString());

\\here i want the button to create the second fragment and pass the variable d to it
 ActivityBeamRec.mViewPager.setPagingEnabled(true); // this is to enable the siwpe between the fragments
ActivityBeamRec.mViewPager.setCurrentItem(2); // ths is to set the new fragment as the current view

            }
        });
        return rootView;
    }



}

第二个片段应该在按下按钮后在创建视图阶段进行,如果有办法,请告诉每个代码放在哪里。

2 个答案:

答案 0 :(得分:2)

<强> ActivityBeamRec:

public class ActivityBeamRec extends AppCompatActivity {

    private SectionsPagerAdapter mSectionsPagerAdapter;

    private ViewPager mViewPager;

    private TabLayout tabLayout;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {
        // This list holds the fragments for the pages displayed by view pager.
        private List < Fragment > fragments = new ArrayList < Fragment > ();

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
            // Add the first fragment:
            fragments.add(PlaceholderFragment.newInstance(1));
        }

        private void addFragment(Fragment fragment) {
            fragments.add(fragment);

            // Notify view pager that the contents of the adapter has changed and that it needs to update
            // its pages:
            notifyDataSetChanged();

            // Since content of view pager has changed, re-wire tab layout:
            tabLayout.setupWithViewPager(mViewPager);

            // Set the current page in the view pager to the last added fragment:
            mViewPager.setCurrentItem(fragments.size() - 1);
        }

        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }

        @Override
        public int getCount() {
            return fragments.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // Set the tab title as the number of the current section:
            return "SECTION " + (position + 1);
        }
    }

    /**
     * Adds a new fragment (page) to the view pager.
     * This method can either be public or package-private (without any modifier) depending on the package
     * of 'PlaceholderFragment'. Since you're new to Java please refer the link to access modifiers below.
     *
     * @param fragment the fragment to be added to the view pager
     **/
    public void addFragment(Fragment fragment) {
        mSectionsPagerAdapter.addFragment(fragment);
    }

    /**
     * Returns the number of the next section (page) to be added.
     *
     * @return the next section number
     */
    public int getNextSectionNumber() {
        return mSectionsPagerAdapter.getCount() + 1;
    }

}

<强> PlaceholderFragment:

public class PlaceholderFragment extends Fragment {

    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    public PlaceholderFragment() {}

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

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

        final EditText etxb;
        etxb = (EditText) rootView.findViewById(R.id.editText);
        final Button buDesign = (Button) rootView.findViewById(R.id.buDesign);

        buDesign.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                double b;
                b = Double.valueOf(etxb.getText().toString());

                //here i want the button to create the second fragment and pass the variable d to it
                int nextSectionNumber = ((ActivityBeamRec) getActivity()).getNextSectionNumber();
                ((ActivityBeamRec) getActivity()).addFragment(PlaceholderFragment.newInstance(nextSectionNumber));
            }
        });
        return rootView;
    }
}

单击片段中的按钮时,将按顺序执行以下操作:

    通过传递要添加的片段实例来调用
  1. addFragment()父活动的方法。此公共方法用于访问父活动的私有成员mSectionsPagerAdapter。如果将mSectionsPagerAdapter设为公开或包私有,我们可以取消此方法。
  2. SectionsPagerAdapter将传入的片段添加到其片段列表中,然后通知视图寻呼机其数据集已更改。
  3. TabLayout将刷新以容纳新片段(页面)。
  4. 最后,视图寻呼机使用setCurrentItem()方法滚动到添加的片段。
  5. 参考:

答案 1 :(得分:1)

在SectionsPagerAdapter

private ArrayList<Fragment> fragments = new ArrayList<>();

@Override
public int getCount() {
   return fragments.size();
}

@Override
public Fragment getItem(int position) {
  if(position<fragments.size())
      return fragments.get(position);
  throw new NullPointerException("No Fragment with this position found.");
}
public void addFragment(Fragment newFragment){
  fragments.add(newFragment);
}

在使用mViewPager.setAdapter(mSectionsPagerAdapter);设置适配器之前的MainActivity中添加第一个片段(在您的情况下为PlaceHolder)。 (或者在SectionPagerAdapter的构造函数中执行此操作)。

然后在OnClickListener调用SectionPagerAdapter的{​​{1}}方法。

编辑:在MainActivity中:

addFragment