繁体   English   中英

片段通过滑动以及单击按钮从一个片段移动到另一个片段

[英]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.appandroid.support.v4.app中都有Fragment类。

我认为您正在使用android.support.v4.app.FragmentfragmentTransaction.replace(int, Fragment)方法使用android.app.Fragment

因此,要使其工作, getFragmentManager()更改为getSupportFragmentManager()并修复导入,以使用android.support.v4.app中的类。

我认为您应该尝试操作栏选项卡而不是3个按钮。这是相同的代码。

  1. 在您的类定义中添加Implements子句。

     public class MainActivity extends FragmentActivity implements ActionBar.TabListener{ 
  2. 在类ActionBar栏中初始化以下内容; ViewPager viewpager; PageAdapter ft;

  3. 在的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 } 
  4. 在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"/>; 
  5. 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; } } 
  6. 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> 
  7. 您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM