Вкладки в диалоговом окне оповещения

#android

#Android

Вопрос:

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

Вот мой 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)
 

Ответ №1:

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

Сначала вам нужно расширить 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());
 

Счастливого кодирования

Комментарии:

1. здравствуйте, я добавил их сейчас.

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

3. это с помощью DialogFragment работает, я тоже делал это раньше, но я хотел показать это как диалоговое окно оповещения, и я не смог, все равно спасибо

Ответ №2:

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

Комментарии:

1. Можете ли вы попробовать выполнить все настройки после вызова show() ? Возможно, он не может найти представления по идентификатору, потому что они еще не видны.

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

3. Я сделал все, что вы сказали, я пытался вызывать метод show() везде, и если я вызываю его до alertDialog.setView(dialogView) того, как откроется диалоговое окно, но без чего-либо, просто экран становится немного прозрачно-черным, никакого окна нет.