[英]How to replace current fragment with a new fragment in a view pager with a click of a button
[英]add fragment to pager adapter on button click
我有一個帶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;
}
}
按下按鈕后,第二個片段應該進入創建視圖階段,如果可以的話,請告訴我將每個代碼放在哪里。
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;
}
}
占位符片段:
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;
}
}
單擊片段中的按鈕時,將依次發生以下情況:
addFragment()
方法。 此公共方法用於訪問父活動的私有成員mSectionsPagerAdapter
。 如果將mSectionsPagerAdapter
公共或程序包私有,則可以取消此方法。 SectionsPagerAdapter
將傳入的片段添加到其片段列表中,然后通知視圖分頁器其數據集已更改。 TabLayout
刷新以適應新的片段(頁面)。 setCurrentItem()
方法使視圖分頁器滾動到添加的片段。 參考:
在您的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);
}
在MainActivity中,使用mViewPager.setAdapter(mSectionsPagerAdapter);
設置適配器之前mViewPager.setAdapter(mSectionsPagerAdapter);
添加您的第一個片段(在您的情況下為PlaceHolder
)。 (或在SectionPagerAdapter
的構造函數中執行此操作)。
然后在您的OnClickListener
調用SectionPagerAdapter
的addFragment
方法。
編輯:在MainActivity中:
mSectionsPagerAdapter.addFragment(PlaceholderFragment.newInstance(0));
mSectionsPagerAdapter.setAdapter(mSectionsPagerAdapter);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.