web-dev-qa-db-fra.com

Utiliser l'intention d'appeler un fragment d'un autre fragment

J'utilise un contrôle viewpager pour héberger trois fragments.J'ai placé un bouton dans chaque fragment pour aller au fragment suivant.Alors je voulais savoir comment passer d'un fragment à un autre en utilisant l'intention?

L’objectif principal est de créer un formulaire d’inscription divisé en trois parties. Le code est présenté ci-dessous:

L'activité principale:

package pl.looksok.viewpagerdemo;

import Android.os.Bundle;
import Android.support.v4.app.FragmentActivity;
import Android.support.v4.view.ViewPager;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.View.OnTouchListener;

public class MainActivity extends FragmentActivity {
    ViewPager pager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyPagerAdapter pageAdapter = new MyPagerAdapter(getSupportFragmentManager());
         pager = (ViewPager)findViewById(R.id.myViewPager);
        pager.setAdapter(pageAdapter);

    }

}

Le premier fragment:

package pl.looksok.viewpagerdemo;

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

public class FragmentBlue extends Fragment {
Button btnnext1;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_blue, container, false);
        btnnext1=(Button) view.findViewById(R.id.btnnext1);

        btnnext1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                 Intent intent = new Intent(view.getContext(), FragmentGreen.class);
                    view.getContext().startActivity(intent);
                    getActivity().finish();

            }
        });

        return view;
    }
}

Le deuxième fragment:

package pl.looksok.viewpagerdemo;

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

public class FragmentGreen extends Fragment {
Button btnnext2;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_green, container, false);
        btnnext2=(Button) view.findViewById(R.id.btnnext2);
        btnnext2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), FragmentPink.class);
                view.getContext().startActivity(intent);
                getActivity().finish();

            }
        });
        return view;
    }
}

Le troisième fragment:

package pl.looksok.viewpagerdemo;

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

public class FragmentPink extends Fragment {
Button btnnext3;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_pink, container, false);
        btnnext3=(Button) view.findViewById(R.id.btnnext3);
        btnnext3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {


            }
        });
        return view;
    }
}

L'adaptateur pour le viewpager:

package pl.looksok.viewpagerdemo;

import Java.util.ArrayList;
import Java.util.List;

import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentManager;
import Android.support.v4.app.FragmentPagerAdapter;

public class MyPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        this.fragments = new ArrayList<Fragment>();
        fragments.add(new FragmentBlue());
        fragments.add(new FragmentGreen());
        fragments.add(new FragmentPink());
    }

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

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

La classe personnalisée pour le viewpager:

package pl.looksok.viewpagerdemo;

import Android.content.Context;
import Android.support.v4.view.ViewPager;
import Android.util.AttributeSet;
import Android.view.MotionEvent;

public class CustomViewPager extends ViewPager {

    private boolean isPagingEnabled = false;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onInterceptTouchEvent(event);
    }

    public void setPagingEnabled(boolean b) {
        this.isPagingEnabled = b;
    }
}

Le code que j'utilise maintenant montre l'erreur suivante en cliquant sur le premier bouton:

09-20 10:54:18.632: E/AndroidRuntime(9401): FATAL EXCEPTION: main
09-20 10:54:18.632: E/AndroidRuntime(9401): Android.content.ActivityNotFoundException: Unable to find explicit activity class {pl.looksok.viewpagerdemo/pl.looksok.viewpagerdemo.FragmentGreen}; have you declared this activity in your AndroidManifest.xml?
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.app.Instrumentation.checkStartActivityResult(Instrumentation.Java:1405)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1379)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.app.Activity.startActivityForResult(Activity.Java:2827)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:824)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.app.Activity.startActivity(Activity.Java:2933)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at pl.looksok.viewpagerdemo.FragmentBlue$1.onClick(FragmentBlue.Java:25)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.view.View.performClick(View.Java:2538)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.view.View$PerformClick.run(View.Java:9152)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.os.Handler.handleCallback(Handler.Java:587)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.os.Looper.loop(Looper.Java:130)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Android.app.ActivityThread.main(ActivityThread.Java:3689)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Java.lang.reflect.Method.invokeNative(Native Method)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at Java.lang.reflect.Method.invoke(Method.Java:507)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:842)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:600)
09-20 10:54:18.632: E/AndroidRuntime(9401):     at dalvik.system.NativeStart.main(Native Method)

La question est donc de savoir comment utiliser l'intention entre les fragments. Existe-t-il un meilleur moyen de diviser le formulaire d'inscription en trois parties sans utiliser viewpager?

6
user3852672

Si tous les fragments se trouvent dans le même ViewPager et que vous souhaitez simplement accéder à ce fragment, vous n'avez pas besoin de Intents. tout ce dont vous avez besoin est:

mViewPager.setCurrentItem(POSITION, true);

ici POSITION est un entier.

Maintenant, le pageur de vue est dans Activity mais la Button est à l'intérieur Fragment, vous devez donc créer cette méthode dans votre activité.

public void selectFragment(int position){
mViewPager.setCurrentItem(position, true); 
// true is to animate the transaction
}

et appelez comme ceci dans votre OnClickListener:

((MainActivity)getActivity()).selectFragment(POSITION_YOU_WANNA_SELECT);

J'espère que ça aide.

5
SMR

Vous ne pouvez pas appeler votre fragment comme ça,

  Intent intent = new Intent(view.getContext(), FragmentGreen.class);
  view.getContext().startActivity(intent);
  getActivity().finish();

vous devez appeler votre fragment comme ça 

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    FragmentGreen llf = new FragmentGreen();
    ft.replace(R.id.listFragment, llf);
    ft.commit();

Intent est essentiellement utilisé pour appeler une activité d’une autre. Pour ajouter une nouvelle Fragment, vous ne pouvez pas utiliser Intent. Pour cela, vous devez utiliser FragmentManager et pour le fragment ouvert FragmentTransaction.

pour plus de détails, allez ici

13
Piyush
FragmentManager fm=getFragmentManager();
fm.beginTransaction().replace(R.layout.fragment_blue, (Fragment)new FragmentGreen()).commit();
getActivity().getActionBar().setTitle("Home");
0
Nay Linn