web-dev-qa-db-fra.com

Le fragment est transparent et montre l'activité ci-dessous

Ma Android se lance dans BeginActivity qui est une sous-classe de SherlockFragmentActivity et montre sa première vue en utilisant:

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

        if (getSupportFragmentManager().findFragmentById(Android.R.id.content) == null) {
            Fragment f = LoginFragment.newInstance();

            getSupportFragmentManager()
                    .beginTransaction()
                    .add(Android.R.id.content, f, "loginfragment")
                    .attach(f)
                    .commit();
        }
}

LoginFragment affiche une vue comme celle-ci:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.login, container, false);

        // Get pointers to text views
        usernameField = (EditText) v.findViewById(R.id.usernameLog);
        passwordField = (EditText) v.findViewById(R.id.passwordLog);
        progressBar = (ProgressBar) v.findViewById(R.id.progressBarLog);
        // Set button click listeners for both buttons
        Button b = (Button) v.findViewById(R.id.loginButton);
        b.setOnClickListener(this);

        return v;
    }

en cliquant sur connexion, j'affiche une vue de liste comme celle-ci:

BeginActivity top = (BeginActivity) getActivity();
Fragment f = OfferListFragment.newInstance();
        top.getSupportFragmentManager()
                .beginTransaction()
                .add(Android.R.id.content, f, "offerList")
                .addToBackStack(f.getClass().getSimpleName())
                .commit();

et enfin, OfferListFragment affiche sa vue comme ceci:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.offers, container, false);

        return v;
    }

Maintenant, le problème que j'ai, c'est que le OfferListFragment final semble être transparent et je peux voir l'écran de connexion en dessous. J'utilise Theme.Sherlock qui a un fond noir. Dois-je également définir manuellement l'arrière-plan des vues sur noir? Ou le noir du thème serait-il personnalisable par l'utilisateur sur le système? (Je ne suis pas un Android).

Merci

36
Darren

Essayez d'utiliser la classe FragmentTransaction pour replace les fragments au lieu de simplement les ajouter.

Explication:

Chaque transaction est un ensemble de modifications que vous souhaitez effectuer en même temps. Vous pouvez configurer toutes les modifications que vous souhaitez effectuer pour une transaction donnée à l'aide de méthodes telles que add(), remove() et replace(). Ensuite, pour appliquer la transaction à l'activité, vous devez appeler commit().

Avant d'appeler commit(), cependant, vous pouvez appeler addToBackStack(), afin d'ajouter la transaction à une pile de transactions fragmentées. Cette pile arrière est gérée par l'activité et permet à l'utilisateur de revenir à l'état de fragment précédent, en appuyant sur le bouton Retour.

Par exemple, voici comment vous pouvez remplacer un fragment par un autre et conserver l'état précédent dans la pile arrière:

Exemple:

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

Référence: Veuillez consulter Gestion des fragments

J'espère que ce sera utile !!

36
Mehul Joisar

À mon humble avis, je ne suis pas d'accord avec cette réponse.

Vous voudrez peut-être remplacer votre fragment ou vous pouvez l'ajouter.

Par exemple, disons que vous vous trouvez dans un fragment qui est une liste récupérée par une demande réseau, si vous remplacez le fragment par disons detailFragment et que vous l'ajoutez à backStack.

Lorsque vous revenez en arrière, votre fragment va refaire la requête réseau, bien sûr vous pouvez la mettre en cache mais pourquoi? Il s'agit d'un retour à un état précédent, donc avec l'ajout, le dernier fragment sera exactement dans le même état sans aucun code.

Les fragments ont un arrière-plan transparent par défaut, car ils ne peuvent être utilisés que pour peindre une petite partie de l'écran, mais si votre fragment est match_parent, définissez simplement son arrière-plan sur une couleur et continuez à utiliser add sur le fragmentTransaction.

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/scrollView1"
Android:background="@Android:color/white"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" >

Ce sera votre élément racine sur le XML de mise en page du fragment, pourrait être linéaire, etc etc et le code de transaction est:

YourFragment detail = YourFragment.newInstance(Id);
ft.add(R.id.contentHolder, detail);
ft.addToBackStack(TAG);
ft.commit();

J'espère que cela aide quelqu'un qui veut savoir comment voir un fond solide sans changer l'ajout à remplacer, ce qui n'est généralement pas le meilleur des cas.

Cordialement

76
Goofyahead

j'ai utilisé de nombreuses techniques mais pas de gain Finalement, je l'ai corrigé en ajoutant l'arrière-plan du conteneur ou la disposition des fragments comme ceci

Android:background="@Android:color/white"    

vous avez juste besoin d'ajouter dans votre mise en page ou la vue conteneur de vous Fragment J'espère que cela vous aidera

4
Sultan Ali