2016-10-14 4 views
0

Я пытаюсь показать вкладки с фрагментами внутри AlertDialog, но я не мог решить эту проблему, и я не понял, что это вызывает.Вкладки в диалоговом окне Alert Dialog

Вот мой MainActivity.java

import android.support.design.widget.TabLayout; 
import android.support.v4.view.ViewPager; 

import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     ((Button)findViewById(R.id.showDialog)).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); 
       View dialogView = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_dialog,null); 

       TabLayout dialogTabLayout = (TabLayout)dialogView.findViewById(R.id.dialog_tablayout); 
       ViewPager dialogViewPager = (ViewPager) dialogView.findViewById(R.id.dialog_viewpager); 

       dialogTabLayout.addTab(dialogTabLayout.newTab().setText("Tab 1")); 
       dialogTabLayout.addTab(dialogTabLayout.newTab().setText("Tab 2")); 

       dialogViewPager.setAdapter(new DialogAdapter(getSupportFragmentManager())); 

       alertDialog.setView(dialogView); 

       alertDialog.show(); 


      } 
     }); 



    } 
} 

DialogFirst.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 


public class DialogFirst extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.dialog_first,container, false); 
    } 

} 

DialogSecond.java

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class DialogSecond extends Fragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.dialog_second,container,false); 
    } 
} 

DialogAdapter.java

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 

public class DialogAdapter extends FragmentStatePagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: return new DialogFirst(); 
      case 1: return new DialogSecond(); 
      default: return null; 
     } 

    } 

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

layout_dialog.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

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

    <android.support.v4.view.ViewPager 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/dialog_viewpager"/> 

</LinearLayout> 

dialog_first.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:text="Dialog 1"/> 

</LinearLayout> 

dialog_second.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Dialog 2"/> 

</LinearLayout> 

Всякий раз, когда я запускаю код и нажмите на кнопку MainActivity, чтобы показать диалоговое окно, я получаю эту ошибку:

java.lang.IllegalArgumentException: No view found for id 0x7f0c007c (com.myapp.tabbeddialog:id/dialog_viewpager) for fragment DialogFirst{554e0d5 #0 id=0x7f0c007c} 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1638) 
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679) 
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1240) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1088) 
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:687) 
at android.view.View.measure(View.java:19730) 
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2271) 
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1331) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1607) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) 
at android.view.Choreographer.doCallbacks(Choreographer.java:683) 
at android.view.Choreographer.doFrame(Choreographer.java:619) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) 
at android.os.Handler.handleCallback(Handler.java:751) 
E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

ответ

0

Использование dialogTabLayout.setupWithViewPager(dialogViewPager) вместо ручного добавления вкладок. Кроме того, поскольку у вас есть только 2 вкладки, вы должны использовать FragmentPagerAdapter, а не FragmentStatePagerAdapter.

+0

Я попытался, по-прежнему имеют те же проблемы –

+0

Вы можете попробовать выполнить все настройки после вызова 'шоу()'? Возможно, он не может найти представления по id, потому что они еще не видны. –

+0

Также попробуйте использовать 'match_parent' для ширины пейджера представления или даже установите его для определенного значения dp. –

0

Я обновил свой ответ

Вам необходимо продлить DialogFragment первым, потому что вы пытаетесь добавить ViewPager с Чайлдс фрагментом внутри встревоженного диалога, который по умолчанию фрагмента так первый

Создать класс PopUpDialogFragment extends DialogFragment

и внутри него добавить следующее

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

     TabLayout dialogTabLayout = (TabLayout) view.findViewById(R.id.dialog_tablayout); 
     ViewPager dialogViewPager = (ViewPager) view.findViewById(R.id.dialog_viewpager); 
     dialogTabLayout.addTab(dialogTabLayout.newTab().setText("Tab 1")); 
     dialogTabLayout.addTab(dialogTabLayout.newTab().setText("Tab 2")); 
     FragmentManager manager = getChildFragmentManager(); 
     dialogViewPager.setAdapter(new DialogAdapter(manager)); 
     getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     return view; 
    } 

и на onClickListener о п Ваше мнение просто добавить

new PopUpDialogFragment().show(getSupportFragmentManager(), PopUpDialogFragment.class.getSimpleName()); 

Дня кодирование

+0

привет, я добавил их сейчас. –

+0

@ sinan-kna Я добавил ответ, пожалуйста, дайте мне знать, если это сработает для вас – user101530

+0

, что с DialogFragment работает, я тоже делал это раньше, но я хотел показать его как Alert Dialog, и я не мог, спасибо вам в любом случае –

Смежные вопросы