【问题标题】:Fragment move from one Fragment to another by sliding as well as button click通过滑动以及单击按钮,片段从一个片段移动到另一个片段
【发布时间】:2014-11-25 07:05:21
【问题描述】:

我有一个由三个按钮、一个片段和一个 ViewPager 组成的视图。如果按 button1,则应显示片段一。如果按下按钮二,则会显示片段二。如果按下按钮三,则会显示片段三。以及从片段一到片段拖曳和片段二到片段三的滑动。问题是如果我执行单独的片段和 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>

【问题讨论】:

  • 这个问题你解决了吗?

标签: java android xml android-fragments


【解决方案1】:

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

android.appandroid.support.v4.app 中有 Fragment 类。

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

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

【讨论】:

    【解决方案2】:

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

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

      public class MainActivity extends FragmentActivity implements ActionBar.TabListener{
      
    2. 在您的类中初始化以下内容 动作栏; ViewPager 浏览器; 页面适配器英尺;

    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. 您的 Fragment xml / 在 3 个 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。它有完整的源代码解释。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 按照建议,我已将代码放在这里并附上解释。希望现在可以了
    • @user3829499 stackoverflow.com/questions/67042935/… 帮帮我兄弟我需要答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多