片段内寻呼机 [英] Pager inside a fragment

查看:225
本文介绍了片段内寻呼机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如我在<一提到href=\"http://stackoverflow.com/questions/24549411/view-pager-is-blank-on-$p$pssing-back-button\">$p$pvious问题 我遇到了一些问题,显示出片段 A 的ViewPage 研究里面打开另一个后片段片段中的 ViewPager 之一。

As mentioned in my previous question I had some problem with showing Fragments inside a ViewPager after opening another Fragment from one of the Fragments inside the ViewPager.

我总算通过使用添加到解决问题() FragmentTransaction 。不幸的是这造成的另一个问题:

I somehow managed to resolve the problem by using add() in the FragmentTransaction. Unfortunately this creates another problem:

我在我的应用程序使用动作条。当我选择两次相同的菜单项我像以前一样遇到同样的问题,它不显示任何片段中的 ViewPager

I am using the ActionBar in my app. When I am selecting the same menu item twice I encounter the same problem as before, it doesn't show any Fragments inside the ViewPager.

首页活动code(其中上单击事件操作栏是调用)

Home Activity Code(where action bar on click events are call)

public class HomePageActivity extends SherlockFragmentActivity implements ICallback {

    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private SherlockActionBarDrawerToggle mDrawerToggle;

    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    private String[] mChampionsMenuItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setTheme(R.style.Theme_Sherlock);
        setContentView(R.layout.activity_home_page);

        mTitle = mDrawerTitle = getTitle();
        mChampionsMenuItems = getResources().getStringArray(R.array.champions_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
        mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mChampionsMenuItems));
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);    
        getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.color.navy_blue));
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        mDrawerToggle = new SherlockActionBarDrawerToggle(this, mDrawerLayout, R.drawable.menu_icon, R.string.drawer_open, R.string.drawer_close) {

            public void onDrawerClosed(View view) {
                getSupportActionBar().setTitle(mTitle);
                supportInvalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getSupportActionBar().setTitle(mDrawerTitle);
                supportInvalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            onFragmentChange(new HomeActivityFragment(), true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }

        switch (item.getItemId()) {
            default: return super.onOptionsItemSelected(item);
        }
    }

    private class DrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);
        }
    }

    private void selectItem(int position) {    
        switch (position) {

            case 0:
                onFragmentChange(new Fragment1(), false);
                break;

            case 1:
                onFragmentChange(new Fragment2(), false);
                break;

            case 2:
                onFragmentChange(new MyPointFragment3(), false);
                break;

            case 3:
                // onFragmentChange(new HomeActivityFragment(), true);
                break;

            case 4:
                onFragmentChange(new QueriesFragment(), false);
                break;

            case 5:
                onFragmentChange(new GalleryFragment(), false);
                break;

            default:
                break;
        }

        mDrawerList.setItemChecked(position, true);
        mDrawerLayout.closeDrawer(mDrawerList);

    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getSupportActionBar().setTitle(mTitle);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public void onFragmentChange(Fragment fragment, boolean flag) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(R.id.content_frame, fragment, fragment.getClass().getName());
        transaction.commit();
    }    
}

这是片段包含 ViewPager

public class Fragment1 extends Fragment implements OnClickListener {

        ICallback callback;
        private LinearLayout headerContainer;
        private ImageView headerLogo;
        private TextView headerName;
        private Button menuBarButton;

        MyAdapter adapter;
        ViewPager pager;
        ActionBar actionBar;

        private Button progOverview, progStr, bonusPoint;

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            if (activity instanceof ICallback) {
                this.callback = (ICallback) activity;
            }
            actionBar = activity.getActionBar();
            actionBar.show();
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = setUpView(inflater, container);        
            return rootView;
        }

        private View setUpView(LayoutInflater inflater, ViewGroup container) {

            View rootView = inflater.inflate(R.layout.fragment_about_champions_club, container, false);

            headerContainer = (LinearLayout) rootView.findViewById(R.id.second_top_header);
            headerContainer.setBackgroundColor(getResources().getColor(R.color.prog_str_blue));
            headerLogo = (ImageView) rootView.findViewById(R.id.header_logo);
            headerLogo.setBackgroundResource(R.drawable.about_champions_ticon);
            headerName = (TextView) rootView.findViewById(R.id.header_name);
            headerName.setText(R.string.about_champ_title);

            adapter = new MyAdapter(getFragmentManager());
            pager = (ViewPager) rootView.findViewById(R.id.pager);
            pager.setAdapter(adapter);

            return rootView;
        }


        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            if (savedInstanceState != null) {
                // Restore last state for checked position.
            }
        }
        }  
    }

这是片段中的一个中的 ViewPager

public class ProgramOverViewFragment extends Fragment {

    ICallback callback;

    @Override
    public void onAttach(Activity activity) {           
        super.onAttach(activity);
        if (activity instanceof ICallback) {
            this.callback = (ICallback) activity;
        }    
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_program_overview, container, false);

        TextView termsAndCond = (TextView) rootView.findViewById(R.id.terms_and_condition_button);
        termsAndCond.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction transaction = fragmentManager.beginTransaction();
                transaction.replace(R.id.content_frame, fragment);
                fragment.setRetainInstance(true);
                transaction.addToBackStack(null);
                transaction.commit();    
            }
        });

        return rootView;
    }
}

我的 FragmentStatePagerAdapter

public class MyAdapter extends FragmentStatePagerAdapter {    

    public MyAdapter(FragmentManager fm) {
        super(fm);    
    }

    @Override
    public android.support.v4.app.Fragment getItem(int index) {
        switch (index) {
            case 0: return new ProgramOverViewFragment();
            case 1: return new ProgramStructureFragment();
            case 2: return new BonusPointFragment();
        }
        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }    
}

感谢您的帮助!

推荐答案

终于让我找到我做错了什么在我的code:

Finally i found what i did wrong in my code :

我使用这个低于code的片段里面查看传呼机设置适配器:

i'm using this below code for setting adapter for view Pager inside a fragment :

  adapter = new MyAdapter(getFragmentManager());
            pager = (ViewPager) rootView.findViewById(R.id.pager);
            pager.setAdapter(adapter);

和替换 getFragmentManager() getChildFragmentManager()我们解决这个问题。按我的理解,我使用的,这就是为什么我有使用getChildFragment经理来存储我的viewPager的过渡片段里面查看传呼机。
这可能帮助别人而这个问题仍然是开放的更好的解决方案。

and by replacing getFragmentManager() to getChildFragmentManager() we resolve this problem. As per my understanding i'm using view pager inside a fragment that's why i have to use getChildFragment manager to store transitions of my viewPager. Might this help someone and this question is still open for better solutions.

这篇关于片段内寻呼机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆