在viewpager中的片段,没有发现错误的视图 [英] fragments in viewpager, no view found error

查看:152
本文介绍了在viewpager中的片段,没有发现错误的视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个活动持有一个片段,在这个片段中有一个按钮,当它被点击时,会弹出一个对话框。



在此对话框中,有一个Viewpager,它包含一些要显示的片段。



这里是代码和错误,请省下宝贵的时间,告诉我我错在哪里。我非常感谢您的帮助。

MainActivity.class

  import android.os.Bundle; 
导入android.support.v4.app.FragmentActivity;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.app.FragmentTransaction;

public class MainActivity extends FragmentActivity {

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

setContentView(R.layout.activity_main);

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();

MyFragment fragment = new MyFragment();

fragmentTransaction.add(R.id.container,fragment);

fragmentTransaction.commit();


$ b $ / code $ / pre
$ b

MyFragment.class

  import android.os.Bundle; 
导入android.support.v4.app.Fragment;
导入android.view.LayoutInflater;
导入android.view.View;
导入android.view.View.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.Button;

public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup容器,
Bundle savedInstanceState){
View v = inflater .inflate(R.layout.fragment_sandbox,container,false);
按钮按钮=(按钮)v.findViewById(R.id.button);

button.setOnClickListener(new OnClickListener(){

@Override $ b $ public void onClick(View arg0){
PagerDialog dialog = new PagerDialog(getActivity (),
getChildFragmentManager());
dialog.show();
}
});
return v;
}
}

PagerDialog.class

  import android.app.Dialog; 
导入android.content.Context;
导入android.os.Bundle;
导入android.support.annotation.Nullable;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.app.FragmentStatePagerAdapter;
导入android.support.v4.view.ViewPager;
导入android.view.LayoutInflater;
导入android.view.View;
导入android.view.ViewGroup;
导入android.widget.ImageView;

public class PagerDialog扩展对话框{

ViewPager mViewPager;
FragmentStatePagerAdapter mAdapter;
FragmentManager mFragmentManager;

public PagerDialog(Context context,FragmentManager fm){
super(context);
mFragmentManager = fm;
}

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog);
mViewPager =(ViewPager)findViewById(R.id.pager);
mAdapter = new MyAdapter(mFragmentManager);
mViewPager.setAdapter(mAdapter);


$ b private class MyAdapter extends FragmentStatePagerAdapter {

public MyAdapter(FragmentManager fm){
super(fm);


$ b $覆盖
public Fragment getItem(int index){
return new DummyFragment();
}

@Override
public int getCount(){
return 2;



$ b private class DummyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
@ Nullable ViewGroup容器,
@Nullable Bundle savedInstanceState){

查看v = inflater.inflate(R.layout.fragment_dummy_layout,
container,false);
return v;
}
}
}

以下是dialog.xml :

 <?xml version =1.0encoding =utf-8?> 
< 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.v4.view.ViewPager
android:id =@ + id / pager
android:layout_width =match_parent
android :layout_height =match_parent/>

< / LinearLayout>

这是错误

 <$ c / c> 03-06 19:43:38.487:E / AndroidRuntime(1167):致命例外:main03-06 19:43:38.487:E / AndroidRuntime(1167):进程:com.me.sandbox,PID:116703 -06 19:43:38.487:E / AndroidRuntime(1167):java.lang.IllegalArgumentException:对于0x87f05003d id(com.mochimira.sandbox:id / pager) -06 19:43:38.487:E / AndroidRuntime(1167):at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:939)03-06 19:43:38.487:E / AndroidRuntime(1167):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)03-06 19:43:38.487:E / AndroidRuntime(1167):在android.support.v4.app.BackStackRecord.run(BackStackRecord。 java:739)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.support.v4.a pp.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)03-06 19:43:38.487:E / AndroidRuntime(1167):at android在Android.support.v4.view.ViewPager.populate(ViewPager.java: 919)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)03-06 19:43:38.487:E / AndroidRuntime 1167):at android.view.View.measure(View.java:16497)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)03 -06 19:43:38.487:E / AndroidRuntime(1167):在android.widget.LinearLayout.measureChildBeforeLayout(Linea E / AndroidRuntime(1167):at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)03-06 19:43:38.487:E / AndroidRuntime( 1167):在android.widget.LinearLayout.onMeasure(LinearLayout.java:588)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.View.measure(View.java:16497)03 -06 19:43:38.487:E / AndroidRuntime(1167):at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.widget .FrameLayout.onMeasure(FrameLayout.java:310)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.View.measure(View.java:16497)03-06 19:43:38.487 :E / AndroidRuntime(1167):在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)03-06 19:43:38.487:E / AndroidRuntime(1167):在android.widget.FrameLayout.onMeasure(FrameLayout。 java:310)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.View.measure(View.java:16497)03-06 19:43:38.487:E / AndroidRuntime(1167) : \t在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)03-06 19: 43 / 38.487:E / AndroidRuntime(1167):在android.widget.LinearLayout.measureVertical(LinearLayout.java:695)03-06 19:43:38.487:E / AndroidRuntime(1167):在android.widget.LinearLayout.onMeasure (LinearLayout.java:588)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.View.measure(View.java:16497)03-06 19:43:38.487:E / AndroidRuntime (1167):at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 03-06 19:43:38.487:E / AndroidRuntime(1167):at com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:2291)03-06 19:43:38.487:E / AndroidRuntime(1167):在android.view.View.measure(View.java:16497)03-06 19:43:38.487:E / AndroidRuntime(1167):at和at roid.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113)03-06 19: 43:38.487:E / AndroidRuntime(1167):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1000)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5670)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.Choreographer.doCallbacks(Choreographer。 java / 574)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.view.Choreographer.doFrame(Choreographer.java:544)03-06 19:43:38.487:E / AndroidRuntime(1167) :at android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.os.Handler.handleCallback(Handler.java:733)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.os.Handler.dispatchMessage(Handler.java: 95)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.os.Looper.loop(Looper.java:136)03-06 19:43:38.487:E / AndroidRuntime(1167):at android.app.ActivityThread.main(ActivityThread.java:5017)03-06 19:43:38.487:E / AndroidRuntime(1167):at java.lang.reflect.Method.invokeNative(Native Method)03-06 19:43 :38.487:E / AndroidRuntime(1167):在java.lang.reflect.Method.invoke(Method.java:515)03-06 19:43:38.487:E / AndroidRuntime(1167):at com.android.internal。 os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)03-06 19:43:38.487:E / AndroidRuntime(1167):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)03 -06 19:43:38.487:E / AndroidRuntime(1167):at dalvik.system.NativeStart.main(Native Method  

p>

解决方案

我找到了解决方案e问题,并修改了您的类,以免再发生此错误。

唯一的区别是您应该使用 DialogFragment 而不是对话框,这样你就可以调用 getChildFragmentManager(),并从接收正确的 FragmentManager DialogFragment

即使您之前使用的是 getChildFragmentManager(),它也来自 MyFragment PagerDialog 类不是 MyFragment 中的子片段。



我已经测试了下面的代码,现在应该可以正常工作了。


$ b MyFragment

  public class MyFragment扩展Fragment {
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
View v = inflater.inflate(R.layout.fragment_sandbox,container,false);
按钮按钮=(按钮)v.findViewById(R.id.button);

button.setOnClickListener(new OnClickListener(){

@Override $ b $ public void onClick(View arg0){
DialogFragment newFragment = PagerDialog.newInstance( );
newFragment.show(getChildFragmentManager(),dialog);
}

});

return v;
}
}

PagerDialog

  public class PagerDialog extends DialogFragment {

public static PagerDialog newInstance(){
return new PagerDialog );
}

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
View v = inflater.inflate(R.layout.dialog_fragment,容器,假);

ViewPager mViewPager =(ViewPager)v.findViewById(R.id.view_pager);
$ b $ *使用PagerDialog提供的childFragmentManager * /
MyAdapter mAdapter = new MyAdapter(getChildFragmentManager());
mViewPager.setAdapter(mAdapter);

return v;
}

private class MyAdapter extends FragmentStatePagerAdapter {

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

@Override
public Fragment getItem(int index){
return new DummyFragment();
}

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

}
}

DummyFragment

  public class DummyFragment extends Fragment {

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

查看v = inflater.inflate(R.layout.fragment_dummy_layout,container,false);
return v;
}

}

fragment_sandbox.xml

 <?xml version =1.0encoding =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:gravity =center>

dialog_fragment.xml

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

TextView
android:layout_width =wrap_content
android:layout_height =wrap_content
android:text =片段对话框标题文本
android:padding =10dp
android:textColor =#333
android:textSize =24sp/>

< android.support.v4.view.ViewPager
android:id =@ + id / view_pager
android:layout_width =match_parent
android :layout_height = 200dp/>

< / LinearLayout>

fragment_dummy_layout.xml

 <?xml version =1.0encoding =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:gravity =center>

TextView
android:layout_width =wrap_content
android:layout_height =wrap_content
android:text =Fragment Dummy Text
android:textSize =24sp
android:textColor =#ff0000/>

< / LinearLayout>


I have an activity holding a fragment, in this fragment there is a button , when it is clicked, a dialog is popped out.

In this dialog, there is a Viewpager, which holds some fragments to display.

Here are the code and the error, please spare your valuable time to show me where I am wrong. I much appreciate your help.

MainActivity.class

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class MainActivity extends FragmentActivity {

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

    setContentView(R.layout.activity_main);

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();

    MyFragment fragment = new MyFragment();

    fragmentTransaction.add(R.id.container, fragment);

    fragmentTransaction.commit();

}
}

MyFragment.class

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

public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_sandbox, container, false);
    Button button = (Button) v.findViewById(R.id.button);

    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            PagerDialog dialog = new PagerDialog(getActivity(),
                    getChildFragmentManager());
            dialog.show();
        }
    });
    return v;
}
}

PagerDialog.class

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

public class PagerDialog extends Dialog {

ViewPager mViewPager;
FragmentStatePagerAdapter mAdapter;
FragmentManager mFragmentManager;

public PagerDialog(Context context, FragmentManager fm) {
    super(context);
    mFragmentManager = fm;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dialog);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mAdapter = new MyAdapter(mFragmentManager);
    mViewPager.setAdapter(mAdapter);

}

private class MyAdapter extends FragmentStatePagerAdapter {

    public MyAdapter(FragmentManager fm) {
        super(fm);

    }

    @Override
    public Fragment getItem(int index) {
        return new DummyFragment();
    }

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

}

private class DummyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_dummy_layout,
                container, false);
        return v;
    }
}
}

Here is the dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<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.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

Here is the error

03-06 19:43:38.487: E/AndroidRuntime(1167): FATAL EXCEPTION: main
03-06 19:43:38.487: E/AndroidRuntime(1167): Process: com.me.sandbox, PID: 1167
03-06 19:43:38.487: E/AndroidRuntime(1167): java.lang.IllegalArgumentException: No view found for id 0x7f05003d (com.mochimira.sandbox:id/pager) for fragment DummyFragment{b2d9f8c8 #0 id=0x7f05003d}
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:939)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.View.measure(View.java:16497)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.View.measure(View.java:16497)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.View.measure(View.java:16497)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.View.measure(View.java:16497)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.View.measure(View.java:16497)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.View.measure(View.java:16497)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.Choreographer.doCallbacks(Choreographer.java:574)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.Choreographer.doFrame(Choreographer.java:544)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.os.Handler.handleCallback(Handler.java:733)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.os.Handler.dispatchMessage(Handler.java:95)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.os.Looper.loop(Looper.java:136)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at java.lang.reflect.Method.invokeNative(Native Method)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at java.lang.reflect.Method.invoke(Method.java:515)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-06 19:43:38.487: E/AndroidRuntime(1167): 	at dalvik.system.NativeStart.main(Native Method

解决方案

I have found a solution to the problem and have modified your classes so that this error no longer occurs.

The only major difference was that you should use a DialogFragment instead of a Dialog, that way you have access to call getChildFragmentManager() and receive the correct FragmentManager from the DialogFragment.

Even though you were using getChildFragmentManager() before, it was coming from MyFragment and the PagerDialog class was not a child fragment in MyFragment.

I have tested the code below, and it should be working fine now.

MyFragment

public class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_sandbox, container, false);
        Button button = (Button) v.findViewById(R.id.button);

        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                DialogFragment newFragment = PagerDialog.newInstance();
                newFragment.show(getChildFragmentManager(), "dialog");
            }

        });

        return v;
    }
}

PagerDialog

public class PagerDialog extends DialogFragment {

    public static PagerDialog newInstance() {
        return new PagerDialog();
    }

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

        ViewPager mViewPager = (ViewPager) v.findViewById(R.id.view_pager);

        /* Use childFragmentManager here provided from the PagerDialog */
        MyAdapter mAdapter = new MyAdapter(getChildFragmentManager());
        mViewPager.setAdapter(mAdapter);

        return v;
    }

    private class MyAdapter extends FragmentStatePagerAdapter {

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

        @Override
        public Fragment getItem(int index) {
            return new DummyFragment();
        }

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

    }
}

DummyFragment

public class DummyFragment extends Fragment {

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

        View v = inflater.inflate(R.layout.fragment_dummy_layout, container, false);
        return v;
    }

}

fragment_sandbox.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:gravity="center">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test Fragment Dialog Pager"
        android:textSize="24sp"
        android:padding="20dp" />

</LinearLayout>

dialog_fragment.xml

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment Dialog Title Text "
        android:padding="10dp"
        android:textColor="#333"
        android:textSize="24sp"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="200dp"/>

</LinearLayout>

fragment_dummy_layout.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:gravity="center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment Dummy Text"
        android:textSize="24sp"
        android:textColor="#ff0000"/>

</LinearLayout>

这篇关于在viewpager中的片段,没有发现错误的视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆