[英]Fragment move from one Fragment to another by sliding as well as button click
我有一个包含三个按钮,一个片段和一个ViewPager的视图。 如果按button1,则应显示片段一。 如果按下按钮2,则显示片段2。 如果按下按钮三,则显示片段三。 从片段1到片段拖曳,从片段2到片段3滑动也应发生。 问题是,如果我执行单独的片段和ViewPager,它将运行。 但我想两者都采用单一布局。 此行显示错误:fragmentTransaction.replace(R.id.fragment_place,fr); 错误是:FragmentTransaction类型的方法replace(int,Fragment)不适用于参数(int,Fragment); 所以请任何人告诉我如何解决此问题。 我同时使用了片段和ViewPager。 我可以在单一布局中使用它们吗?
我该如何解决这个问题,以便通过单击按钮同时发生滑动和片段移动? MainActivity.java类
public class MainActivity extends FragmentActivity {
private PageAdapter mPageAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewpages_layout);
initialingpaging();
}
private void initialingpaging() {
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
fragments.add(Fragment.instantiate(this, Fragment2.class.getName()));
fragments.add(Fragment.instantiate(this, Fragment3.class.getName()));
mPageAdapter = new PageAdapter(this.getSupportFragmentManager(), fragments);
ViewPager pager = (ViewPager)findViewById(R.id.viewpager);
pager.setAdapter(mPageAdapter);
}
public void selectFrag(View view) {
Fragment fr;
switch (view.getId()) {
case R.id.button1:
fr = new Fragment1();
break;
case R.id.button2:
fr = new Fragment2();
break;
case R.id.button3:
fr = new Fragment3();
break;
default:
break;
}
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
}
}
// PageAdapter.java类
public final class PageAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public PageAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
// TODO Auto-generated constructor stub
this.fragments = fragments;
}
@Override
public Fragment getItem(int arg0) {
return this.fragments.get(arg0);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
//Fragment1.java、Fragment2.java和Fragment3.java类类似于以下代码:
public class Fragment3 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(container == null) {
return null;
}
return (LinearLayout) inflater.inflate(R.layout.fragment3_layout,container,false);
}
}
//fragment1_layout.xml、fragment2_layout.xml和fragment3_layout.xml类似于类似的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF0000"
android:orientation="vertical" >
</LinearLayout>
//viewpages_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:onClick="selectFrag"
android:text="Fragment 1" />
<Button
android:id="@+id/button3"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:onClick="selectFrag"
android:text="Fragment 3" />
<Button
android:id="@+id/button2"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:onClick="selectFrag"
android:text="Fragment 2" />
<android.support.v4.view.ViewPager
android:id="@+android:id/viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="100dp"/>
<fragment
android:id="@+id/fragment_place"
android:name="com.example.viewpageexample1.Fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="70dp" />
</RelativeLayout>
确保已导入正确的Fragment类。
android.app和android.support.v4.app中都有Fragment类。
我认为您正在使用android.support.v4.app.Fragment和fragmentTransaction.replace(int, Fragment)
方法使用android.app.Fragment 。
因此,要使其工作, getFragmentManager()
更改为getSupportFragmentManager()
并修复导入,以使用android.support.v4.app中的类。
我认为您应该尝试操作栏选项卡而不是3个按钮。这是相同的代码。
在您的类定义中添加Implements子句。
public class MainActivity extends FragmentActivity implements ActionBar.TabListener{
在类ActionBar栏中初始化以下内容; ViewPager viewpager; PageAdapter ft;
在的onCreate,替换这个代码。
viewpager = new ViewPager(this); viewpager.setId(R.id.pager); setContentView(viewpager); ft = new FragmentPageAdapter(getSupportFragmentManager()); viewpager.setAdapter(ft); final ActionBar bar = getActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); bar.addTab(bar.newTab().setText("Fragment1").setTabListener(this)); bar.addTab(bar.newTab().setText("Fragment2").setTabListener(this)); bar.addTab(bar.newTab().setText("Fragment3").setTabListener(this)); viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub bar.setSelectedNavigationItem(arg0); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.start_screen, menu); return true; } @Override public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) { // TODO Auto-generated method stub } @Override public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) { // TODO Auto-generated method stub viewpager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) { // TODO Auto-generated method stub }
在viewpager_layout中,只有这个。 删除其他所有内容。
<android.support.v4.view.ViewPager android:id="@+android:id/viewpager" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginTop="100dp"/>;
PageAdapter代码应该是这样的。
public class PageAdapter extends FragmentPagerAdapter { public PageAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int arg0) { switch (arg0) { case 0: return new Fragment1(); case 1: return new Fragment2(); case 2: return new Fragment3(); default: break; } return null; } @Override public int getCount() { // TODO Auto-generated method stub return 3; } }
3个XML之间的片段XML /更改背景颜色看到的结果。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/fragment1" android:orientation="vertical" android:background="#00FF33"> </LinearLayout>
您的Fragment1 / 2/3代码
public class Fragment1 extends Fragment { View myFragmentView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { myFragmentView = inflater.inflate(R.layout.fragment1, container, false); return myFragmentView; } }
结帐http://semycolon.blogspot.in/2014/11/first-android-app-step-5-homescreen.html 。 它的源代码的完整说明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.