10

誰でも私に例を教えてもらえますか、または各タブの内容がFragmentsのAndroidで単純なTabbed Dialogを作成する方法を教えてください。私が見つけたすべての例/チュートリアルは、フラグメントとタブについてですが、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はどこから来ていますか?セットアップビュー – svn

答えて

0

代わりにDialogFragmentを使用してみてください。ダイアログフラグメントレイアウトには、fragmentTransactionのLinearLayoutが含まれています。

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

フラグメントは、あなたのタブの断片です。 cheeers

10

これを稼働させるのに多くの時間を費やしましたが、運がありません。私が見つけた唯一の解決策は、ダミーフラグメントtabhostを作成して、代わりにtabhost断片の断片とviewpager使用され

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> 

ダイアログクラス、トリックがあり、使用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ファイルはvoters_dialog.xmlです。私はちょうど間違った名前をputtedし、今修正しました。 –

+0

ありがとうございます。ダイアログが表示されるように正しいライブラリを取得できません。現在、私は以下を呼びます: 'FragmentManager manager = getSupportFragmentManager(); VotersDialog inviteFriend =新しいVotersDialog(); inviteFriend.show(マネージャー、「ok」);「しかし、それを稼働させることに運がない – Sauron

2

私は同じ解決策を探していましたが、私は自分のために何もできませんでした。Androidタブ付きダイアログにフラグメントが含まれています。誰かを助けるかもしれないかもしれません。

あなたはDialogFragmentTabLayoutViewPagerを使用する必要がありますhere

1

からの完全なソースコードをチェックアウトすることができます。例えば、あなたのダイアログフラグメントの見解は次のようになります。

<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では、セットアップ自分のすべきをtabLayoutとviewpager:here

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

私はここに書かれたブログ記事があります。

関連する問題