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

相關問題