4

我正在尝试使用 ViewPager 获取带有三个选项卡的片段。最初,我曾经使用 FragmentMgr 从 Activity 实例化片段,这很好。当我使用 ViewPager 转换此导航时,不再显示此 Fragment。

MainActivity.java

当我像这样启动 Fragment 时,它会显示出来。例如:

LaunchListFragment fragment = new LaunchListFragment();
fragment.newInstance(LIST_TYPE);
getSupportFragmentManager().beginTransaction()
                .add(R.id.item_detail_container,   
 fragment).commit();

我在上面的代码中尝试了这个更改来使用 ViewPager,如下所示:

mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(new LaunchPageAdapter(getSupportFragmentManager(),LIST_TYPE));
mViewPager.setCurrentItem(0);
          

其中 LaunchPageAdapter 调用 LaunchListFragment。

LaunchPageAdapter.java

public class LaunchPageAdapter extends FragmentPagerAdapter {
private static String select="";

    public LaunchPageAdapter(FragmentManager fm, String type) {
        super(fm);
        select=type;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return LaunchListFragment.newInstance(select);
            case 1:
                return AddTeamFragment.newInstance();
           
        }
        return null;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 2;
    }

这是 LaunchListFragment.java

public class LaunchListFragment extends ListFragment implements ActionBar.TabListener {
public static  String LIST_TYPE = "invalid";
GenericListData g_data[] = null;
 
   
   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View result = inflater.inflate(R.layout.fragment_launch_list,
                container, false);
        
         setActionTabs();
         setList();
        return (result);
    }

   
   public static Fragment newInstance(String type) {
    Fragment frag = new LaunchListFragment();
    Bundle args = new Bundle();
    LIST_TYPE=type;
    args.putString(LIST_TYPE, type);
    frag.setArguments(args);
    return (frag);
}

这是 MainActivity 使用的 main.xml 布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools=  "match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:baselineAligned="false"
android:divider="?android:attr/dividerHorizontal"
android:orientation="horizontal"
android:showDividers="middle"
tools:context=".MainActivity" >

<fragment
    android:id="@+id/item_list"
    android:name="com.teammanager.ItemListFragment"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    tools:layout="@android:layout/list_content" />

<FrameLayout
    android:id="@+id/item_detail_container"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="3" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</FrameLayout>

LaunchListFragment 使用的 fragment_launch_list.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:drawSelectorOnTop="false" >
</ListView>

<TextView
    android:id="@+id/itemName"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="5dp"
    android:gravity="center_vertical"
    android:textColor="#000000"
    android:textSize="22dp"
    android:textStyle="bold" />

当我调试它时,我可以看到 LaunchListFragment 正在实例化,onCreate 和 onCreate View 被调用,它只是不会被显示。:(

如果我在 ViewPager 实现中遗漏任何内容,这里有人可以告诉我吗?

更新

当我在不使用 Viewpager 的情况下调用 LaunchListFragment 时,我首先设置了内容视图并传递了 R.id.item_detail_container,这是我希望在其中显示片段的 FrameLayout 的 id。请参考前面的 main.xml

 setContentView(R.layout.main.xml);
 LaunchListFragment fragment = new LaunchListFragment();
 fragment.newInstance(LIST_TYPE);
  getSupportFragmentManager().beginTransaction()
                .add(R.id.item_detail_container,    
  fragment).commit();

当我将其更改为使用 ViewPager 时,我不确定要在哪里显示 Fragment。在我的片段 onView 中,我正在膨胀 fragment_launch_list 并返回视图。但是视图分页器如何知道在哪里设置片段视图。它在 id 寻呼机内吗?

我是一个绝对的初学者,如果所有这些都是幼稚的问题,我深表歉意。

干杯。

4

2 回答 2

2

问题描述非常适合我刚刚遇到的问题。我知道这个问题很老,但这可能会帮助其他面临同样问题的人。@Geoplex 没有显示LaunchPageAdapter类的代码。所以我不确定这是否能解决他的问题。但对我来说,这很有效。

在我的 PagerAdapter 中, public boolean isViewFromObject(View view, Object object)被覆盖了。我删除了该方法并允许 superClass 处理它。这开始给出我预期的结果。

于 2015-07-08T07:59:09.627 回答
1

这对你有用,

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> fragments=null;
    private FragmentManager fragmentManager=null;
    public ViewPagerAdapter(FragmentManager fragmentManager,List<Fragment> fragments) {
        super(fragmentManager);
        this.fragments=fragments;
        this.fragmentManager=fragmentManager;
    }
    @Override
    public Fragment getItem(int position) {
        fragmentManager.beginTransaction().commitAllowingStateLoss();
        return fragments.get(position);
    }
    @Override
    public int getCount() {
        return fragments.size();
    }
    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object)
    {
        super.setPrimaryItem(container,0,fragments.get(0));
    }
    @Override
    public void notifyDataSetChanged()
    {
        super.notifyDataSetChanged();
    }
    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        fragmentManager.executePendingTransactions();
        fragmentManager.saveFragmentInstanceState(fragments.get(position));
    }
    public void replaceItem(int position,Fragment fragment)
    {
        fragments.set(position, fragment);
        this.notifyDataSetChanged();
    }
}

MainActivity.java

public class MainActivity extends FragmentActivity implements OnPageChangeListener,TabListener
{
    private android.support.v4.view.ViewPager mViewPager=null;
    private ViewPagerAdapter mPagerAdapter=null;
    private ActionBar action=null;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        initilizeViewPager();
        action=getActionBar();
                action.setDisplayShowHomeEnabled(false);
                action.setDisplayShowTitleEnabled(false);
                action.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }
         public void initilizeViewPager()
     {
                 mViewPager=(android.support.v4.view.ViewPager)findViewById(R.id.viewPager);
         List<Fragment> fragments = new Vector<Fragment>();
                fragments.add(LaunchListFragment.newInstance(select));
                fragments.add(AddTeamFragment.newInstance());
                fragments.add(thirdFragment.newInstance());
                viewPagerAdapter=new ViewPagerAdapter();
mViewPager.setAdapter(viewPagerAdapter(getSupportFragmentManager(),fragments));
                new setAdapterTask().execute();
        mViewPager.setOnPageChangeListener(this);
     }
     private class setAdapterTask extends AsyncTask<Void,Void,Void>
     {
        protected Void doInBackground(Void... params) 
        {
            return null;
        }
        @Override
        protected void onPostExecute(Void result)
        {
            mViewPager.setAdapter(mPagerAdapter);
            Tab first=action.newTab().setTag("first").setText("First").setTabListener(MainActivity.this);
            Tab second=action.newTab().setTag("second").setText("Second").setTabListener(MainActivity.this);
Tab third=action.newTab().setTag("third").setText("Third").setTabListener(MainActivity.this);
            action.addTab(first);
            action.addTab(second);
                    action.addTab(third);
            }
        }
     }
     public void onPageScrollStateChanged(int arg0) 
     {}
     public void onPageScrolled(int arg0, float arg1, int arg2)
     {}
     public void onPageSelected(int position) 
     {
         getActionBar().setSelectedNavigationItem(position);
     }
public void onTabReselected(Tab tab, FragmentTransaction ft) {}
     public void onTabSelected(Tab tab, FragmentTransaction ft) {
         mViewPager.setCurrentItem(tab.getPosition());
     }
     public void onTabUnselected(Tab tab, FragmentTransaction ft) {}
}

main_layout.xml

<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android" 
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <android.support.v4.view.ViewPager
       android:id="@+id/viewpager"
       android:layout_width="fill_parent"
       android:layout_below="@android:id/tabs"
       android:layout_height="fill_parent"/>
</RelativeLayout>
于 2013-04-18T09:04:10.407 回答