android - 未找到 ID 0x7f0e00d5 的 View (com.example.page :id/dialogViewpager) for fragment OneFragment{92c0220 #1 id=0x7f0e00d5 android:switcher:2131624149:0}

标签 android android-fragments dialog android-tablayout

我想在对话框中显示 tabview。 我有一个扩展到 FragmentActivity 的主类文件,在其中我通过调用此方法来显示对话框,如下所示。

private void dialogDictionary() {

    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.dialog_dictionary);
    dialog.setCancelable(true);

    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

    ImageView imgDialogDictionaryClose = (ImageView) dialog.findViewById(R.id.imgDialogDictionaryClose);
    imgDialogDictionaryClose.setOnClickListener(v -> dialog.dismiss());

    ViewPager viewPager = (ViewPager) dialog.findViewById(R.id.dialogViewpager);
    setupViewPager(viewPager);

    TabLayout tabLayout = (TabLayout) dialog.findViewById(R.id.dialogTabs);
    tabLayout.setupWithViewPager(viewPager);

    dialog.show();
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new OneFragment(), "ONE");
    adapter.addFragment(new TwoFragment(), "TWO");
    adapter.addFragment(new ThreeFragment(), "THREE");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

当我运行应用程序时,出现此错误。

  E/FragmentManager: No view found for id 0x7f0e00d5 (com.example.page:id/dialogViewpager) for fragment OneFragment{eb2a3cc #1 id=0x7f0e00d5 android:switcher:2131624149:0}
  E/FragmentManager: Activity state:
  E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.page, PID: 2710
    java.lang.IllegalArgumentException: No view found for id 0x7f0e00d5 (com.example.page:id/dialogViewpager) for fragment OneFragment{eb2a3cc #1 id=0x7f0e00d5 android:switcher:2131624149:0}
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1107)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
        at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1643)
        at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
        at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1272)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1191)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
        at android.view.Choreographer.doCallbacks(Choreographer.java:670)
        at android.view.Choreographer.doFrame(Choreographer.java:606)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

dialog_dictionary.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:orientation="vertical">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="?android:attr/actionBarSize"
    android:background="@drawable/dialog_title_bar">

    <View
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true" />

    <EditText
        android:id="@+id/edtDictionarySearch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="25dp"
        android:layout_marginRight="10dp"
        android:layout_toLeftOf="@+id/imgDialogDictionaryClose"
        android:background="@android:color/transparent"
        android:drawableLeft="@mipmap/icn_search_white"
        android:drawablePadding="10dp"
        android:hint="@string/search"
        android:singleLine="true"
        android:textColor="@color/white"
        android:textColorHint="@color/white"
        android:textSize="@dimen/dialog_search_text_size" />

    <ImageButton
        android:id="@+id/imgDialogDictionaryClose"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="15dp"
        android:background="@android:color/transparent"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:src="@mipmap/icn_close" />
</RelativeLayout>

<android.support.design.widget.TabLayout
    android:id="@+id/dialogTabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabGravity="fill"
    app:tabMode="fixed" />


<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_bg_area"
    android:padding="@dimen/dialog_inner_padding">

    <android.support.v4.view.ViewPager
       android:id="@+id/dialogViewpager"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</RelativeLayout>
</LinearLayout>

OneFragment.java

public class OneFragment extends Fragment {
public OneFragment() {

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_one, container, false);
}
}

fragment_one.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

   <TextView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:gravity="center"
       android:text="Tab One"
       android:textSize="50dp" />
 </LinearLayout>

最佳答案

据我所知,我并没有立即添加对话框的内容 View 。它是在显示对话框时添加的。您可以尝试做的是创建 Dialog 的子类并将全局布局监听器添加到您的 Dialog 子类。

当 GlobalLayoutListener 触发时,此时获取您的引用,然后移除 Global Layout Listener,这样它就不会一直重新触发。

// in OnCreate()
getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
    @Override
    public void onGlobalLayout() 
    {
        //get references for viewPager
        viewPager = findViewById(R.id.dialogViewpager)
        //remove listener so it doesn't fire again
        getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

更新:

实际上,根据我的想法,您可以创建一个普通对话框并向其添加布局监听器

//note that dialog will need to be final to access it
//in onGlobalLayout below or have a global reference in your class

dialog.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
    @Override
    public void onGlobalLayout() 
    {
        //get references for viewPager
        viewPager = findViewById(R.id.dialogViewpager)
        //remove listener so it doesn't fire again
        dialog.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

关于android - 未找到 ID 0x7f0e00d5 的 View (com.example.page :id/dialogViewpager) for fragment OneFragment{92c0220 #1 id=0x7f0e00d5 android:switcher:2131624149:0},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41279093/

相关文章:

android - 如何在 flutter 的 firestore 中使用 uid 更新用户数据

android - 更新 Android SDK 后 - 布局不显示

android - ActionBar 选项卡 - 用详细信息 fragment 替换列表 fragment

Javafx:以编程方式关闭警报框(或任何对话框)

java - Android - 单击后无法设置可单击(false)按钮

java - 从 Java 调用 Kotlin 的高阶函数

java - 安卓开发: Directing to specific tabs in fragment

android - 如何解决此 fragment "non-default constructor"错误?

layout - 将jqgrid对话框(表单编辑对话框)分为两个布局

java - Android 自定义进度对话框 - setCancelable()