2014-11-25 81 views
0

我有一个由三个按钮,一个片段和一个ViewPager组成的视图。如果按下按钮1,则应显示片段1。如果按下按钮2,则会显示片段2。如果按下按钮三,则显示片段三。以及滑动应该发生从第一个片段到第二个片段并且第二个片段到第三个片段。问题是,如果我执行单独的片段和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> 
+0

你是否得到了修正? – vilpe89 2015-01-08 15:02:08

回答

-1

我想,而不是3个按钮,你应该尝试的操作栏tabs..here是相同的代码。

  1. 将实现子句添加到您的类定义中。

    public class MainActivity extends FragmentActivity implements ActionBar.TabListener{ 
    
  2. 初始化类 动作条酒吧内以下; 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. Your Fragment xml /更改背景颜色在3 xmls之间以查看结果。

    <?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. 你的片段1/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。它有一个完整的源代码解释。

+1

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – DB5 2014-11-25 08:09:49

+0

正如所建议的,我已将代码放在这里解释。希望现在好了 – user3829499 2014-11-25 10:56:58

0

确保您已经导入了正确的Fragment类。

还有片段类android.appandroid.support.v4.app

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

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

相关问题