【问题标题】:Trouble with ViewPager displaying FragmentsViewPager 显示片段的问题
【发布时间】:2013-04-18 08:41:57
【问题描述】:

我正在尝试使用 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 pager里面吗?

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

干杯。

【问题讨论】:

  • 只是好奇,为什么是select变量static
  • 我之前是从其他fragment中设置值select的,这是一种在对象之间传递数据的懒惰方式。
  • 当您想将值从一个片段传输到另一个片段时,请使用接口。不使用静态变量,这是不正确的方式..!

标签: android android-fragments android-viewpager fragmentpageradapter


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这对你很有用,

    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>
    

    【讨论】:

    • 感谢您的回答。我复制了您的代码并按照说明操作,没有显示 LaunchListFragment。我进行了调试,它在操作栏上添加了选项卡-该部分起作用,然后用正确的值等填充列表,调用片段的 onView,只是没有显示列表。您认为这与 ViewPager 的可见性设置有关吗?
    • 所有片段事务的设置都应该填充到它们的父级(如活动或其父级片段)。我认为您的交易与他们的活动有关,因此您处理所有查看寻呼机交易并在活动中添加标签。
    • 您好,刚才,我从 LaunchListFragment 中删除了设置 ActionTab 值到 MainActivity(父活动)。这没有进行任何更改,因为 LaunchListFragment 仍然没有使用 ViewPager 显示。我怀疑这是布局,请在最初的问题中检查我的更新。
    • 您认为主要布局有什么问题?我在哪里添加活动?是不是少了,有,这条评论没有显示。
    • 我已经编辑了我的答案,试试吧。他们的所有交易都超出了 MainActivity..
    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 2016-03-02
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多