10

Kann mir jemand auf ein Beispiel zeigen oder mir zeigen, wie man eine einfache Tabbed Dialog in Android erstellen, wo der Inhalt jeder Registerkarte Fragments sind? Alle Beispiele/Tutorials, die ich gefunden habe, sind über Fragmente und Tabs, aber nichts spezifisch für DialogFragments.Wie erstelle ich einen Android Tabbed Dialog, der Fragmente enthält?

Die Dokumentation für FragmentTabHost zeigt, wie Registerkarten in normalen Fragmenten mit getChildFragmentManager() erstellt werden. Ich gehe davon aus das sollte auch funktionieren, wenn das Fragment ein DialogFragment ist, aber wenn ich es versuche ich:

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

Hier ist mein Code für die Ansicht der Einrichtung (die dann auf AlertDialog.setView() geben wird):

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

Woher kommt View v? Können Sie zeigen, die Methode, die SetupView ruft – svn

Antwort

0

Verwenden Sie stattdessen DialogFragment, und fügen Sie in Ihrem Dialogfragmentlayout ein LinearLayout für FragmentTransaction hinzu.

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

Fragment ist Ihr Tab-Fragment. cheeers

10

Verbrachte viel Zeit, um es zum Laufen zu bringen, aber kein Glück. Die einzige Lösung gefunden I ist dummy Fragment TabHost erstellen und verwenden viewpager mit Fragmenten

anstelle von TabHost Fragmente

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-Klasse, ist der Trick Verwendung onCreateView nicht 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); 
       } 
      }); 

     } 

    } 

} 

Hier ist das Ergebnis, jetzt können Sie Tabs drücken oder Fragmente wischen

enter image description here

+0

Dies kann wirklich meine App helfen, danke für die Freigabe. Wäre es möglich, die zugrunde liegenden Ansichten zu veröffentlichen? dh. Wähler_dialog.xml, Gibt es Quellcode auf Github oder verwandt? – Sauron

+0

@Sauron, XML-Datei oben ist genau Wähler_dialog.xml, ich habe gerade falsch Namen putschte, reparierte es jetzt. –

+0

Danke. Ich habe Probleme, die richtigen Bibliotheken zu erhalten, damit der Dialog angezeigt wird. Zur Zeit rufe ich an: 'FragmentManager manager = getSupportFragmentManager(); VotersDialog inviteFriend = new VotersDialog(); inviteFriend.show (Manager, "ok"); 'Aber kein Glück, es zur Arbeit zu bringen – Sauron

2

Ich war auf der Suche nach der gleichen Lösung, aber nichts funktionierte für mich, so dass ich mein eigenes Android Registerkarte Dialogfeld mit Fragmenten baute. Vielleicht hilft es jemandem.

können Sie den vollständigen Quellcode von here

1

Kasse Sie einen DialogFragment, TabLayout und ViewPager verwenden sollten. Zum Beispiel, Ihre Dialogansicht des Fragments kann wie folgt aussehen:

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

Bauen Sie Ihren Adapter und stellen Sie sicher, dass Sie die getPageTitleMethod außer Kraft setzen, zum Beispiel:

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(); 
    } 
} 

Im OnCreateView Ihres Dialog, sollten Sie Setup Ihre viewpager mit dem 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; 
    } 

ich es hier einen Blog-Post geschrieben haben: here.