web-dev-qa-db-fra.com

Comment démarrer une activité à partir d'un fragment?

J'ai un ensemble d'onglets à l'intérieur d'un FragmentActivity qui contiennent chacun leur propre fragment. Lorsque j'ai essayé de démarrer une nouvelle activité à partir de ce fragment via un onClickListener et en utilisant la méthode startActivity(myIntent), la force de mon application s'est fermée.

Après avoir regardé pendant un moment, j'ai trouvé une référence ou deux à une méthode appelée startActivityFromFragment, mais après une heure de recherche environ, je ne trouve aucune explication ni exemple d'utilisation ou de savoir si cela est ce que je devrais utiliser.

Je suppose que ce que je demande, c'est s'il existe une différence entre le lancement d'une nouvelle activité à partir d'une activité et le lancement d'une nouvelle activité à partir d'un fragment, et si oui, que dois-je mettre en œuvre?

53
user1617134

Vous devriez le faire avec getActivity().startActivity(myIntent)

49
EkKoZ

Je l'ai fait, le code ci-dessous fonctionne pour moi ....

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

        Button newPage = (Button)v.findViewById(R.id.click);
        newPage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), HomeActivity.class);
                startActivity(intent);
            }
        });
        return v;
    }

et Assurez-vous que votre activité de destination doit être inscrite dans le fichier Manifest.xml.

mais dans mon cas, tous les onglets ne sont pas affichés dans HomeActivity, y a-t-il une solution pour cela?

45
Jayesh

La différence entre le lancement d’une activité à partir d’un fragment et d’une activité dépend de la manière dont vous obtenez le contexte car, dans les deux cas, il doit s'agir d’une activité.

d'une activité: Le contexte est l'activité en cours (this)

Intent intent = new Intent(this, NewActivity.class);
startActivity(intent);

A partir d'un fragment: Le contexte est l'activité parente (getActivity()). Notez que le fragment lui-même peut démarrer l'activité via startActivity(), il n'est pas nécessaire que l'opération soit effectuée à partir de l'activité.

Intent intent = new Intent(getActivity(), NewActivity.class);
startActivity(intent);
11
David Dostal

Je le fais comme ça, pour lancer SendFreeTextActivity à partir d'un fragment de menu (personnalisé) qui apparaît dans plusieurs activités:

Dans la classe MenuFragment:

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

    final Button sendFreeTextButton = (Button) view.findViewById(R.id.sendFreeTextButton);
    sendFreeTextButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Log.d(TAG, "sendFreeTextButton clicked");
            Intent intent = new Intent(getActivity(), SendFreeTextActivity.class);
            MenuFragment.this.startActivity(intent);
        }
    });
    ...
6
fadedbee

Utilisez le contexte de base de l'activité dans laquelle réside votre fragment pour commencer une intention.

Intent j = new Intent(fBaseCtx, NewactivityName.class);         
startActivity(j);

fBaseCtx est BaseContext de votre activité actuelle. Vous pouvez l'obtenir sous la forme fBaseCtx = getBaseContext();

1
user2766004