警报对话框中的选项卡

时间:2016-10-14 21:14:46

标签: 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)

2 个答案:

答案 0 :(得分:0)

使用dialogTabLayout.setupWithViewPager(dialogViewPager)而不是手动添加标签。此外,由于您只有2个标签,因此您应使用FragmentPagerAdapter而不是FragmentStatePagerAdapter

答案 1 :(得分: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());

快乐编码