如何创建一个Android选项卡式对话框包含的片段? [英] How to create an Android Tabbed Dialog containing fragments?

本文介绍了如何创建一个Android选项卡式对话框包含的片段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

任何人都可以点我的例子或告诉我如何创建一个简单的选项卡式对话框在Android中,每个选项卡的内容是片段?我发现所有的例子/教程是关于碎片和标签,但没有具体到 DialogFragments

的文档 FragmentTabHost 显示了如何使用创建正常的片段内标签 getChildFragmentManager()。我假定这也应该工作的时候片段是 DialogFragment 但是当我尝试它,我得到:

  java.lang.IllegalStateException:片段不有一番景致在android.support.v4.app.Fragment $ 1.findViewById(Fragment.java:1425)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:901)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
...
 

下面是我的$ C $下建立视图(然后将其传递给 AlertDialog.setView()):

 私人无效setupView函数(视图v){
    mTabHost =(FragmentTabHost)v.findViewById(android.R.id.tabhost);

   mTabHost.setup(getActivity(),getChildFragmentManager(),R.id.realtabcontent);

   mTabHost.addTab(mTabHost.newTabSpec(TAB1)。setIndicator(TAB1),
            MyDialogFragment.class,NULL);
}
 

解决方案

花了大量的时间来得到它的工作,但没有运气。我发现的唯一的解决办法是创建虚拟片段tabhost和使用viewpager与片段,而不是tabhost片段

voters_dialog.xml

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
        机器人:layout_height =match_parent
        机器人:layout_width =match_parent
        机器人:方向=垂直
        >

        < android.support.v4.app.FragmentTabHost
                机器人:layout_width =match_parent
                机器人:layout_height =WRAP_CONTENT
                机器人:ID =@ + ID /标签
                >
        < /android.support.v4.app.FragmentTabHost>

        < android.support.v4.view.ViewPager
                机器人:ID =@ + ID /寻呼机
                机器人:layout_width =match_parent
                机器人:layout_height =match_parent
                机器人:重力=中心/>

< / LinearLayout中>
 

Dialog类,诀窍是使用onCreateView不onCreateDialog

 公共类VotersDialog扩展DialogFragment {


    私人FragmentTabHost mTab​​Host;
    私人ViewPager viewPager;
    私人VotersPagerAdapter适配器;


    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
        查看查看= inflater.inflate(R.layout.voters_dialog,集装箱);

        。getDialog()的setTitle(getArguments()的getString(标题));

        mTabHost =(FragmentTabHost)view.findViewById(R.id.tabs);

        mTabHost.setup(getActivity(),getChildFragmentManager());
        mTabHost.addTab(mTabHost.newTabSpec(TAB1)setIndicator(Плюсов),Fragment.class,空);
        mTabHost.addTab(mTabHost.newTabSpec(TAB2)setIndicator(Минусов),Fragment.class,空);


        适配器=新VotersPagerAdapter(getChildFragmentManager(),getArguments());
        adapter.setTitles(新的String [] {Плюсов,Минусов});

        viewPager =(ViewPager)view.findViewById(R.id.pager);
        viewPager.setAdapter(适配器);

        viewPager.setOnPageChangeListener(新ViewPager.OnPageChangeListener(){
            @覆盖
            公共无效onPageScrolled(INT I,浮动V,INT I2){
            }

            @覆盖
            公共无效onPageSelected(int i)以{
                mTabHost.setCurrentTab(ⅰ);
            }

            @覆盖
            公共无效onPageScrollStateChanged(int i)以{

            }
        });

        mTabHost.setOnTabChangedListener(新TabHost.OnTabChangeListener(){
            @覆盖
            公共无效onTabChanged(String s)将{
                INT I = mTab​​Host.getCurrentTab();
                viewPager.setCurrentItem(ⅰ);
            }
        });

        返回查看;
    }


    公共类VotersPagerAdapter扩展FragmentPagerAdapter {

        捆绑包;
        的String []冠军;

        公共VotersPagerAdapter(FragmentManager FM){
            超(FM);
        }

        公共VotersPagerAdapter(FragmentManager FM,束束){
            超(FM);
            this.bundle =束;
        }

        @覆盖
        公共片段的getItem(INT NUM){
            片段片段=新VotersListFragment();
            捆绑的args =新包();
            args.putSerializable(选民,bundle.getSerializable(NUM == 0优点:缺点));
            fragment.setArguments(参数);
            返回片段;
        }

        @覆盖
        公众诠释getCount将(){
            返回2;
        }

        @覆盖
        公共CharSequence的getPageTitle(INT位置){
            回到标题[位置]
        }

        公共无效setTitles(字符串[]职称){
            this.titles =冠军;
        }
    }

    公共静态类VotersListFragment扩展ListFragment {

        名单<字符串>选民;

        @覆盖
        公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
            查看查看= inflater.inflate(R.layout.list_fragment,集装箱,假);
            返回查看;
        }

        @覆盖
        公共无效onActivityCreated(包savedInstanceState){

            super.onActivityCreated(savedInstanceState);
            选民=(ArrayList中)getArguments()getSerializable(选民)。

            ArrayAdapter<字符串>适配器=新的ArrayAdapter<字符串>(getActivity(),android.R.layout.simple_list_item_1选民);
            setListAdapter(适配器);

            getListView()。setOnItemClickListener(新AdapterView.OnItemClickListener(){
                @覆盖
                公共无效onItemClick(适配器视图<>适配器视图,视图中查看,INT I,长L){
                    意向意图=新的意图(getActivity(),ProfileActivity_.class);
                    字符串登录= voters.get(我);
                    。intent.putExtra(登录,Utils.en codeString的(login.substring(0,login.indexOf(())修剪()));
                    startActivity(意向);
                }
            });

        }

    }

}
 

下面是结果,现在你可以preSS选项卡或刷卡片段

Can anyone point me to an example or show me how to create a simple Tabbed Dialog in Android where the contents of each tab are Fragments? All the examples/tutorials I have found are about Fragments and Tabs, but nothing specific to DialogFragments.

The documentation for FragmentTabHost shows how to create tabs within normal fragments using getChildFragmentManager(). I'm assuming this should also work when the fragment is a DialogFragment but when I try it I get:

java.lang.IllegalStateException: Fragment does not have a view at android.support.v4.app.Fragment$1.findViewById(Fragment.java:1425)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:901)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
...

Here's my code for setting up the view (which is then passed to AlertDialog.setView()):

private void setupView(View v) {
    mTabHost = (FragmentTabHost) v.findViewById(android.R.id.tabhost);

   mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);

   mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Tab1"),
            MyDialogFragment.class, null);
}

解决方案

Spent a lot of time to get it working, but no luck. The only solution I found is create dummy fragment tabhost and use viewpager with fragments instead of tabhost fragments

voters_dialog.xml

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

        <android.support.v4.app.FragmentTabHost
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/tabs"
                >
        </android.support.v4.app.FragmentTabHost>

        <android.support.v4.view.ViewPager
                android:id="@+id/pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"/>

</LinearLayout>

Dialog class, the trick is use onCreateView not onCreateDialog

public class VotersDialog extends DialogFragment {


    private FragmentTabHost mTabHost;
    private ViewPager viewPager;
    private VotersPagerAdapter adapter;


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

        getDialog().setTitle(getArguments().getString("title"));

        mTabHost = (FragmentTabHost) view.findViewById(R.id.tabs);

        mTabHost.setup(getActivity(), getChildFragmentManager());
        mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Плюсов"), Fragment.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Минусов"), Fragment.class, null);


        adapter = new VotersPagerAdapter(getChildFragmentManager(), getArguments());
        adapter.setTitles(new String[]{"Плюсов", "Минусов"});

        viewPager = (ViewPager)view.findViewById(R.id.pager);
        viewPager.setAdapter(adapter);

        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i2) {
            }

            @Override
            public void onPageSelected(int i) {
                mTabHost.setCurrentTab(i);
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

        mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
            @Override
            public void onTabChanged(String s) {
                int i = mTabHost.getCurrentTab();
                viewPager.setCurrentItem(i);
            }
        });

        return view;
    }


    public class VotersPagerAdapter extends FragmentPagerAdapter {

        Bundle bundle;
        String [] titles;

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

        public VotersPagerAdapter(FragmentManager fm, Bundle bundle) {
            super(fm);
            this.bundle = bundle;
        }

        @Override
        public Fragment getItem(int num) {
            Fragment fragment = new VotersListFragment();
            Bundle args = new Bundle();
            args.putSerializable("voters",bundle.getSerializable( num == 0 ? "pros" : "cons"));
            fragment.setArguments(args);
            return fragment;
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            return titles[position];
        }

        public void setTitles(String[] titles) {
            this.titles = titles;
        }
    }

    public static class VotersListFragment extends ListFragment {

        List<String> voters;

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

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {

            super.onActivityCreated(savedInstanceState);
            voters = (ArrayList) getArguments().getSerializable("voters");

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, voters);
            setListAdapter(adapter);

            getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    Intent intent = new Intent(getActivity(), ProfileActivity_.class);
                    String login = voters.get(i);
                    intent.putExtra("login", Utils.encodeString(login.substring(0, login.indexOf("(")).trim()));
                    startActivity(intent);
                }
            });

        }

    }

}

Here is result, now you can press tabs or swipe fragments

这篇关于如何创建一个Android选项卡式对话框包含的片段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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