在 PopupWindow(或 DialogFragment)中带有 Fragments 的 ViewPager - 错误没有找到片段 id 的视图 [英] ViewPager with Fragments inside PopupWindow (or DialogFragment) - Error no view found for id for fragment

查看:32
本文介绍了在 PopupWindow(或 DialogFragment)中带有 Fragments 的 ViewPager - 错误没有找到片段 id 的视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用下面的代码创建了一个 FragmentActivity

I created a FragmentActivity with this code below

public class Activity_principal1 extends FragmentActivity {

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

        List<Fragment> fragments = getFragments();
        AcoesMuscularesAdapter ama = new AcoesMuscularesAdapter(getSupportFragmentManager(), fragments);
        ViewPager vp_contentAcoesMusculares_SequenciaExercicios = (ViewPager) findViewById(R.id.vp_contentAcoesMusculares_SequenciaExercicios);
        vp_contentAcoesMusculares_SequenciaExercicios.setAdapter(ama);

    }

    private List<Fragment> getFragments(){
        List<Fragment> fList = new ArrayList<Fragment>();
        fList.add(FragmentAcoesMusculares.newInstance("Fragment 1",1));
        fList.add(FragmentAcoesMusculares.newInstance("Fragment 2",2));
        fList.add(FragmentAcoesMusculares.newInstance("Fragment 3",3));
        return fList;
    }

}

这是我的 XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/framelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white" >

<android.support.v4.view.ViewPager
    android:id="@+id/vp_contentAcoesMusculares_SequenciaExercicios"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="5dp"
    android:background="#fff" />

</RelativeLayout>

FragmentAcoesMusculares(方法getFragments()中的代码)就是下面这个类

The FragmentAcoesMusculares (the code inside the method getFragments()) is this class below

public class FragmentAcoesMusculares extends Fragment{

    public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";

    public static final FragmentAcoesMusculares newInstance(String message,int item)
    {
        FragmentAcoesMusculares f = new FragmentAcoesMusculares();
        Bundle bdl = new Bundle(item);
        f.item = item;
        bdl.putString(EXTRA_MESSAGE, message);
        f.setArguments(bdl);
        return f;
    }


    private int item;
    private ImageView images;
    private String urlString = "";
    int i = 0;;

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

         images = (ImageView) v.findViewById(R.id.images);
         final Runnable r = new Runnable() {

            @Override
            public void run() {
            if(i == 0){
                urlString = "http://54.232.207.226/atlas.limittraining.com.br/thumb/grupo-muscular-sequencia/1/0/0/bb91e662b4fd6ffde74757ff9bd6e108.jpg";
            }else{
                urlString = "http://54.232.207.226/atlas.limittraining.com.br/thumb/grupo-muscular-sequencia/1/0/0/7730258ca72a75365d0c4b92a1a68a0a.jpg";
            }

            AQuery aquery = new AQuery(images);
            aquery.image(urlString);
            i++;
            if(i >= 2){
                i = 0;
            }
            images.postDelayed(this, 1500);
        }
    };
    images.postDelayed(r, 1500);

    return v;
}

}

这是我的适配器

public class AcoesMuscularesAdapter extends FragmentPagerAdapter{

    private List<Fragment> fragments;

    public AcoesMuscularesAdapter(FragmentManager fm, List<Fragment> fragments){
        super(fm);
        this.fragments = fragments;
    }

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

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

上面的所有代码都运行良好.

All this code above it's working perfectly.

现在我正在尝试创建一个具有我的 ViewPager 的 PopupWindow(或 DialogFragment).

Now I'm trying to create a PopupWindow (or DialogFragment) who will have my ViewPager.

我为此修改了代码(现在我的 XML activity_principal1 只有一个按钮,而新的 XML 弹出窗口有我的 ViewPager)

I modified my code for this (now my XML activity_principal1 have just a Button and the new XML popup have my ViewPager)

public class Activity_principal1 extends FragmentActivity {

private LayoutInflater inflater;
private View view;
private PopupWindow window;
private Button abrir;

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

    List<Fragment> fragments = getFragments();
    AcoesMuscularesAdapter ama = new AcoesMuscularesAdapter(getSupportFragmentManager(), fragments);

    inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    view = inflater.inflate(R.layout.popup, null,true);

    ViewPager vp_contentAcoesMusculares_SequenciaExercicios = (ViewPager) view.findViewById(R.id.vp_contentAcoesMusculares_SequenciaExercicios);
    vp_contentAcoesMusculares_SequenciaExercicios.setAdapter(ama);

    window = new PopupWindow(view);

    abrir = (Button) findViewById(R.id.abrir);
    abrir.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            window.showAsDropDown(v);
        }
    });
}

private List<Fragment> getFragments(){
    List<Fragment> fList = new ArrayList<Fragment>();
        fList.add(FragmentAcoesMusculares.newInstance("Fragment 1",1));
        fList.add(FragmentAcoesMusculares.newInstance("Fragment 2",2));
        fList.add(FragmentAcoesMusculares.newInstance("Fragment 3",3));
    return fList;
}

}

最后,这是现在发生的错误.

and FINALLY, this is the error that is occurring now.

10-23 12:29:39.273: E/FragmentManager(6062): No view found for id 0x7f080005 (br.com.examples.testeprojects:id/vp_contentAcoesMusculares_SequenciaExercicios) for fragment FragmentAcoesMusculares{419e41d0 #0 id=0x7f080005 android:switcher:2131230725:0}
10-23 12:29:39.273: E/FragmentManager(6062): Activity state:
10-23 12:29:39.273: D/FragmentManager(6062):   Local FragmentActivity 419d8e78 State:
10-23 12:29:39.281: D/FragmentManager(6062):     mCreated=truemResumed=true mStopped=false mReallyStopped=false
10-23 12:29:39.281: D/FragmentManager(6062):     mLoadersStarted=true
10-23 12:29:39.281: D/FragmentManager(6062):   Active Fragments in 419d9f78:
10-23 12:29:39.281: D/FragmentManager(6062):     #0: FragmentAcoesMusculares{419e41d0 #0 id=0x7f080005 android:switcher:2131230725:0}
10-23 12:29:39.281: D/FragmentManager(6062):       mFragmentId=#7f080005 mContainerId=#7f080005 mTag=android:switcher:2131230725:0
10-23 12:29:39.281: D/FragmentManager(6062):       mState=1 mIndex=0 mWho=android:fragment:0 mBackStackNesting=0
10-23 12:29:39.281: D/FragmentManager(6062):       mAdded=true mRemoving=false mResumed=false mFromLayout=false mInLayout=false
10-23 12:29:39.281: D/FragmentManager(6062):       mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
10-23 12:29:39.281: D/FragmentManager(6062):       mRetainInstance=false mRetaining=false mUserVisibleHint=true
10-23 12:29:39.281: D/FragmentManager(6062):       mFragmentManager=FragmentManager{419d9f78 in Activity_principal1{419d8e78}}
10-23 12:29:39.289: D/FragmentManager(6062):       mActivity=br.com.examples.testeprojects.Activity_principal1@419d8e78
10-23 12:29:39.289: D/FragmentManager(6062):       mArguments=Bundle[{EXTRA_MESSAGE=Fragment 1}]
10-23 12:29:39.289: D/FragmentManager(6062):     #1: FragmentAcoesMusculares{419e4450 #1 id=0x7f080005 android:switcher:2131230725:1}
10-23 12:29:39.289: D/FragmentManager(6062):       mFragmentId=#7f080005 mContainerId=#7f080005 mTag=android:switcher:2131230725:1
10-23 12:29:39.289: D/FragmentManager(6062):       mState=0 mIndex=1 mWho=android:fragment:1 mBackStackNesting=0
10-23 12:29:39.289: D/FragmentManager(6062):       mAdded=true mRemoving=false mResumed=false mFromLayout=false mInLayout=false
10-23 12:29:39.289: D/FragmentManager(6062):       mHidden=false mDetached=false mMenuVisible=false mHasMenu=false
10-23 12:29:39.289: D/FragmentManager(6062):       mRetainInstance=false mRetaining=false mUserVisibleHint=false
10-23 12:29:39.296: D/FragmentManager(6062):       mFragmentManager=FragmentManager{419d9f78 in Activity_principal1{419d8e78}}
10-23 12:29:39.296: D/FragmentManager(6062):       mArguments=Bundle[{EXTRA_MESSAGE=Fragment 2}]
10-23 12:29:39.296: D/FragmentManager(6062):   Added Fragments:
10-23 12:29:39.296: D/FragmentManager(6062):     #0: FragmentAcoesMusculares{419e41d0 #0 id=0x7f080005 android:switcher:2131230725:0}
10-23 12:29:39.296: D/FragmentManager(6062):     #1: FragmentAcoesMusculares{419e4450 #1 id=0x7f080005 android:switcher:2131230725:1}
10-23 12:29:39.296: D/FragmentManager(6062):   FragmentManager misc state:
10-23 12:29:39.296: D/FragmentManager(6062):     mActivity=br.com.examples.testeprojects.Activity_principal1@419d8e78
10-23 12:29:39.296: D/FragmentManager(6062):     mContainer=android.support.v4.app.FragmentActivity$2@419da8d0
10-23 12:29:39.296: D/FragmentManager(6062):     mCurState=5 mStateSaved=false mDestroyed=false
10-23 12:29:39.296: D/FragmentManager(6062):   View Hierarchy:
10-23 12:29:39.296: D/FragmentManager(6062):     com.android.internal.policy.impl.PhoneWindow$DecorView{419db990 V.E..... ... 0,0-600,976}
10-23 12:29:39.296: D/FragmentManager(6062):       android.widget.LinearLayout{419dd410 V.E..... ... 0,0-600,976}
10-23 12:29:39.296: D/FragmentManager(6062):         android.view.ViewStub{419de850 G.E..... ... 0,0-0,0 #10203e5}
10-23 12:29:39.304: D/FragmentManager(6062):         android.widget.FrameLayout{419dec20 V.E..... ... 0,0-600,976 #1020002 android:id/content}
10-23 12:29:39.304: D/FragmentManager(6062):           android.widget.RelativeLayout{419dfe98 V.E..... ... 0,0-600,976 #7f080000 app:id/framelayout}
10-23 12:29:39.304: D/FragmentManager(6062):             android.widget.Button{419e0618 VFED..C. ... 0,0-73,48 #7f080002 app:id/abrir}
10-23 12:29:39.304: W/System.err(6062): java.lang.IllegalArgumentException: No view found for id 0x7f080005 (br.com.examples.testeprojects:id/vp_contentAcoesMusculares_SequenciaExercicios) for fragment FragmentAcoesMusculares{419e41d0 #0 id=0x7f080005 android:switcher:2131230725:0}
10-23 12:29:39.304: W/System.err(6062):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
10-23 12:29:39.304: W/System.err(6062):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
10-23 12:29:39.304: W/System.err(6062):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
10-23 12:29:39.304: W/System.err(6062):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
10-23 12:29:39.304: W/System.err(6062):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
10-23 12:29:39.312: W/System.err(6062):     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
10-23 12:29:39.312: W/System.err(6062):     at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
10-23 12:29:39.312: W/System.err(6062):     at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
10-23 12:29:39.312: W/System.err(6062):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
10-23 12:29:39.312: W/System.err(6062):     at android.view.View.measure(View.java:15479)
10-23 12:29:39.312: W/System.err(6062):     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:617)
10-23 12:29:39.312: W/System.err(6062):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:399)
10-23 12:29:39.312: W/System.err(6062):     at android.view.View.measure(View.java:15479)
10-23 12:29:39.312: W/System.err(6062):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1968)
10-23 12:29:39.312: W/System.err(6062):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1214)
10-23 12:29:39.312: W/System.err(6062):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1387)
10-23 12:29:39.312: W/System.err(6062):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
10-23 12:29:39.312: W/System.err(6062):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4464)
10-23 12:29:39.312: W/System.err(6062):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
10-23 12:29:39.320: W/System.err(6062):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
10-23 12:29:39.320: W/System.err(6062):     at android.view.Choreographer.doFrame(Choreographer.java:525)
10-23 12:29:39.320: W/System.err(6062):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
10-23 12:29:39.320: W/System.err(6062):     at android.os.Handler.handleCallback(Handler.java:615)
10-23 12:29:39.320: W/System.err(6062):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-23 12:29:39.320: W/System.err(6062):     at android.os.Looper.loop(Looper.java:137)
10-23 12:29:39.320: W/System.err(6062):     at android.app.ActivityThread.main(ActivityThread.java:4895)
10-23 12:29:39.320: W/System.err(6062):     at java.lang.reflect.Method.invokeNative(Native Method)
10-23 12:29:39.320: W/System.err(6062):     at java.lang.reflect.Method.invoke(Method.java:511)
10-23 12:29:39.320: W/System.err(6062):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
10-23 12:29:39.328: W/System.err(6062):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
10-23 12:29:39.328: W/System.err(6062):     at dalvik.system.NativeStart.main(Native Method)

有人知道我做错了什么吗?

Does someone know what I doing wrong?

谢谢和问候.

推荐答案

我找到了解决问题的方法.

I found a way to my problem.

我们开始

首先我使用 DialogFragment 而不是 PopupView.

First I used DialogFragment instead of PopupView.

所以在我的主要活动中,我只创建了一个调用我的 DialogFragment 的按钮.

So in my main activity, I only created a Button who calls my DialogFragment.

public class Activity_principal1 extends FragmentActivity {


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

        Button abrir = (Button) findViewById(R.id.botao);
        abrir.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                new DialogFragmentWindow().show(getSupportFragmentManager(), "");
            }
        });
    }

}

我的适配器还是和问题一样.

My adapter still the same as the question.

这就是魔法发生的地方.

And here is where the magic occurs.

public class DialogFragmentWindow extends DialogFragment {

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

        ViewPager vp_contentAcoesMusculares_SequenciaExercicios = (ViewPager) view.findViewById(R.id.vp_contentAcoesMusculares_SequenciaExercicios);
        List fragments = getFragments();
        AcoesMuscularesAdapter ama = new AcoesMuscularesAdapter(getChildFragmentManager(), fragments);
        vp_contentAcoesMusculares_SequenciaExercicios.setAdapter(ama);

        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

        return view;
    }

    private List getFragments(){
        List fList = new ArrayList();
            fList.add(FragmentAcoesMusculares.newInstance("Fragment 1",1));
            fList.add(FragmentAcoesMusculares.newInstance("Fragment 2",2));
            fList.add(FragmentAcoesMusculares.newInstance("Fragment 3",3));
        return fList;
    }
}

区别在于 getChildFragmentManager().这段代码拯救了我.

The difference is the getChildFragmentManager(). This little piece of code saved my day.

对此的解释是,当我使用 getSupportFragmentManager() 甚至指示视图分页器在他认为在主布局 XML 中的另一个布局 XML 中时.

The explanation to this is when I was using getSupportFragmentManager() and even indicating the view pager was in another Layout XML he thought being in the main Layout XML.

现在我的应用程序获取了子片段,所以他现在可以看到 ViewPager.

Now my app gets the child fragment so now he sees the ViewPager.

就是这样.

谢谢大家.

这篇关于在 PopupWindow(或 DialogFragment)中带有 Fragments 的 ViewPager - 错误没有找到片段 id 的视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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