web-dev-qa-db-fra.com

Fragment vs vue personnalisée dans Android

Le fragment et la vue personnalisée peuvent atteindre la fonction similaire, je sais que le fragment est plus réutilisable que la vue personnalisée, d'autres avantages/améliorations pour l'utilisation du fragment? Le fragment est-il censé remplacer la vue personnalisée ou simplement une amélioration dans un but précis?

Par exemple, le code ci-dessous est fragment:

public class TestFragment extends Fragment {

    private TextView tv_name;
    private Button btn_play;
    private Button btn_delete;

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

    @Override
    public void onStart() {
        super.onStart();

        tv_name = (TextView)getView().findViewById(R.id.tv_name);
        btn_play = (Button)getView().findViewById(R.id.btn_play);
        btn_delete = (Button)getView().findViewById(R.id.btn_delete);

    }
}

Le code pour vue personnalisée:

public class TestCustomView extends LinearLayout {

    private TextView tv_name;
    private Button btn_play;
    private Button btn_delete;

    public TestCustomView(Context context, AttributeSet attrs){
        super(context, attrs);

        setOrientation(LinearLayout.HORIZONTAL);
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        tv_name = new TextView(context);
        addView(tv_name);

        btn_play = new Button(context);
        addView(btn_play);

        btn_delete = new Button(context);
        addView(btn_delete);
    }

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

TestFragment et TestCustomView peuvent créer une vue composée de TextView et Buttons, et utiliser des balises de Framelayout/fragment et com.packagename.TestCustomView à déclarer dans le fichier de mise en page xml de l'activité, mais quels sont les avantages à utiliser Fragment?

47
Kai Y

Le fragment peut être utilisé dans différents scénarios, mais les plus utilisés sont:

  • enrouler autour d'une vue
  • fragment sans tête - c'est-à-dire pas de vue => pas très utile en général mais peut être utilisé
  • fragment conservable - peut être l'un des éléments ci-dessus. En utilisant Fragment.setRetainInstance (true) vous pouvez contourner Fragment.onDestroy () , c'est-à-dire que vous pouvez conserver les données de fragment sur les changements de configuration mais la structure de la vue de fragment est toujours détruite/recréée
  • peut être ajouté à la pile de retour d'activité, c.-à-d. restauration facile de l'état précédent du bouton Précédent

Il y a des cas où les fragments sont une douleur complète dans le cou, puis il y a des cas où ils peuvent obtenir des résultats plus rapidement.

Pour certaines situations personnalisées et plus flexibles, les fragments peuvent être encombrés et leur gestion serait difficile. Ainsi, le traitement direct des vues peut être très pratique et plus utile dans certains cas. Mais tout est basé sur les exigences.

Remarque View a également son propre cycle de vie et peut stocker/recréer l'état d'instance enregistré. Un peu plus de travail mais il a aussi l'option.

27
Dimitar Genov

Les vues personnalisées ont l'avantage de la simplicité et leur objectif principal est d'afficher une donnée à l'écran. Ils doivent s'appuyer sur d'autres composants pour en faire plus.

Considérez les fragments comme une unité fonctionnelle, un moyen d'afficher une partie de l'interface utilisateur qui a un objectif spécifique, en utilisant une ou plusieurs vues. Les fragments sont connectés au cycle de vie de l'activité et ils peuvent inclure et contrôler des chargeurs pour remplir les vues avec des données. Ils peuvent également inclure des sous-fragments. Enfin, ils peuvent également être ajoutés à une pile arrière synthétique. Ils peuvent faire beaucoup de choses et sont quelque peu complexes à apprendre.

Comme vous pouvez le voir, les fragments ont beaucoup plus en commun avec les activités qu'avec les vues personnalisées.

En remarque, les fragments peuvent également être sans tête (sans interface utilisateur). Les fragments sans tête fournissent un moyen d'encapsuler des fonctionnalités non visuelles en s'appuyant sur le cycle de vie de l'activité dans un composant distinct.

17
BladeCoder

Les fragments sont livrés avec leur propre cycle de vie, qui peut être un obstacle ou un bonus, selon ce dont vous avez besoin.

Les fragments obtiennent des méthodes de cycle de vie comme onResume ou onSavedInstanceState, qui peuvent vous aider à gérer les transitions d'état dans votre application. Si vous utilisez des vues personnalisées, vous devez gérer ce genre de choses par vous-même.

Il y a des gens qui plaident contre l'utilisation de fragments, je suggère de lire https://corner.squareup.com/2014/10/advocating-against-Android-fragments.html

15
Malthan