10

任何人都可以点示例或向我展示如何在Android中创建一个简单的Tabbed Dialog,其中每个标签的内容都是Fragments?我找到的所有示例/教程都是关于片段和制表符的,但没有具体到DialogFragments如何创建包含片段的Android选项卡式对话框?

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

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) 
... 

这是我为建立视图(然后传递给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); 
} 
+0

View v从哪里来?你可以显示调用setupView – svn

回答

0

尝试使用DialogFragment来代替,并且在您的dialogfragment布局中包含用于fragmentTransaction的LinearLayout。

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
String Tag = fragment.getClass().getSimpleName(); 
t.replace(R.id.llTabFragmentContainer, fragment, Tag); 
t.commit(); 

片段是您的选项卡片段。 cheeers

10

花了很多时间让它工作,但没有运气。我发现的唯一的解决方案是创建虚拟片段tabhost和使用viewpager与片段,而不是tabhost片段

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类,诀窍是使用onCreateView不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); 
       } 
      }); 

     } 

    } 

} 

这里是结果,现在你可以按标签或刷卡片段

enter image description here

+0

的方法这真的可以帮助我的应用程序,谢谢你的分享。是否可以发布底层视图?即。 voters_dialog。xml,github上有相关的源代码吗? – Sauron

+0

@Sauron,上面的确切XML文件是vot_dialog.xml,我只是把错误的名字,现在修复它。 –

+0

谢谢。我无法获得正确的库,以便出现对话框。目前我在调用:'FragmentManager manager = getSupportFragmentManager(); VotersDialog inviteFriend = new VotersDialog(); inviteFriend.show(经理,“好”);'但没有运气让它工作 – Sauron

2

我正在寻找相同的解决方案,但没有为我工作,所以我建立了我自己的Android标签对话框包含片段。可能是它可能有助于某人。

你可以从here

1

检出完整的源代码,您应该使用DialogFragmentTabLayoutViewPager。例如,你的对话片段的观点,可能是这样的:

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

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/masterViewPager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</LinearLayout> 

构建您的适配器,并确保覆盖getPageTitleMethod,如:

public class CustomAdapter extends FragmentPagerAdapter { 
    List<Fragment> mFragmentCollection = new ArrayList<>(); 
    List<String> mTitleCollection = new ArrayList<>(); 
    public CustomAdapter(FragmentManager fm) { 
    super(fm); 
    } 
    public void addFragment(String title, Fragment fragment) 
    { 
    mTitleCollection.add(title); 
    mFragmentCollection.add(fragment); 
    } 
    //Needed for 
    @Override 
    public CharSequence getPageTitle(int position) { 
    return mTitleCollection.get(position); 
    } 
    @Override 
    public Fragment getItem(int position) { 
    return mFragmentCollection.get(position); 
    } 
    @Override 
    public int getCount() { 
    return mFragmentCollection.size(); 
    } 
} 

在对话框的OnCreateView,您应该设置你的viewpager与tabLayout:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootview = inflater.inflate(R.layout.dialog_sample,container,false); 
    tabLayout = (TabLayout) rootview.findViewById(R.id.tabLayout); 
    viewPager = (ViewPager) rootview.findViewById(R.id.masterViewPager); 
    CustomAdapter adapter = new CustomAdapter(getChildFragmentManager()); 
    adapter.addFragment("Boy",CustomFragment.createInstance("John")); 
    adapter.addFragment("Girl",CustomFragment.createInstance("Stacy")); 
    adapter.addFragment("Robot",CustomFragment.createInstance("Aeon")); 
    viewPager.setAdapter(adapter); 
    tabLayout.setupWithViewPager(viewPager); 
    return rootview; 
    } 

我有一个博客帖子上写在这里:here

相关问题