简体   繁体   English

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

[英]Fragment move from one Fragment to another by sliding as well as button click

I have a view that consist of three buttons, a fragment and a ViewPager. 我有一个包含三个按钮,一个片段和一个ViewPager的视图。 If you press button1 then fragment one should be shown. 如果按button1,则应显示片段一。 If you press button two then fragment two is shown. 如果按下按钮2,则显示片段2。 If you press button three then fragment Three is shown. 如果按下按钮三,则显示片段三。 As well as sliding should happen from from fragment one to fragment tow and fragment two to fragment three. 从片段1到片段拖曳,从片段2到片段3滑动也应发生。 The problem is that If I execute separate fragment and ViewPager it runs. 问题是,如果我执行单独的片段和ViewPager,它将运行。 But I want both in single layout. 但我想两者都采用单一布局。 Error show in this line : fragmentTransaction.replace(R.id.fragment_place, fr); 此行显示错误:fragmentTransaction.replace(R.id.fragment_place,fr); and error is :The method replace(int, Fragment) in the type FragmentTransaction is not applicable for the arguments (int, Fragment); 错误是:FragmentTransaction类型的方法replace(int,Fragment)不适用于参数(int,Fragment); so please anybody tell me how to fix this problem. 所以请任何人告诉我如何解决此问题。 I used both fragment as well as ViewPager. 我同时使用了片段和ViewPager。 Can I use both in single layout. 我可以在单一布局中使用它们吗?

How can I solve this problem so both will happen like sliding as well as fragment move by button click? 我该如何解决这个问题,以便通过单击按钮同时发生滑动和片段移动? MainActivity.java class 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 class // 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 and Fragment3.java class are like below code: //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 and fragment3_layout.xml are like similar code: //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 //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>

Make sure that you have imported the right Fragment class. 确保已导入正确的Fragment类。

There is Fragment class in android.app and in android.support.v4.app . android.appandroid.support.v4.app中都有Fragment类。

I think you are using android.support.v4.app.Fragment and fragmentTransaction.replace(int, Fragment) method uses android.app.Fragment . 我认为您正在使用android.support.v4.app.FragmentfragmentTransaction.replace(int, Fragment)方法使用android.app.Fragment

So to make it work, change getFragmentManager() to getSupportFragmentManager() and fix imports to use classes from android.support.v4.app . 因此,要使其工作, getFragmentManager()更改为getSupportFragmentManager()并修复导入,以使用android.support.v4.app中的类。

I think instead of 3 buttons, you should try action bar tabs..here is the code for the same. 我认为您应该尝试操作栏选项卡而不是3个按钮。这是相同的代码。

  1. add implements clause to your class definition. 在您的类定义中添加Implements子句。

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

  3. In onCreate, replace your code with this. 在的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. In viewpager_layout, only have this. 在viewpager_layout中,只有这个。 Remove everything else. 删除其他所有内容。

     <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 code should be like this. 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. Your Fragment xml / change background color between 3 xmls to see results. 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. Your Fragment1/2/3 code 您的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; } } 

checkout http://semycolon.blogspot.in/2014/11/first-android-app-step-5-homescreen.html . 结帐http://semycolon.blogspot.in/2014/11/first-android-app-step-5-homescreen.html It has a complete explanation with source code. 它的源代码的完整说明。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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