web-dev-qa-db-fra.com

Android: Changer la couleur de fond du fragment

J'ai essayé de changer la couleur de fond d'un fragment, mais un petit problème est survenu.

public class MainActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Donc, montré au dessus de est le code que j'avais pour ma classe principale qui appelle le fichier XML pour le fragment.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="horizontal" >

    <fragment
        Android:id="@+id/fragment1"
        Android:name="com.northreal.practice.FirstFragment"
        Android:layout_width="0dip"
        Android:layout_height="match_parent"
        Android:layout_weight="1"
        Android:background="#CBA" />

</LinearLayout>

Au dessus de est la disposition main.xml appelée par la classe principale (MainActivity).

public class FirstFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.main, parent, false);
    }
}

Au dessus de le fichier XML avec le fragment appelle cette classe.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="horizontal"
     >

    <TextView
        Android:id="@+id/tv"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="BLAHHHH"
        Android:layout_gravity="center_vertical" />

</LinearLayout>

Cette mise en page au dessus de est gonflé par la classe FirstFragment

Alors, pourquoi cela ne change-t-il pas réellement la couleur de l'arrière-plan de mon fragment?

21
Brandon Ling

Les fragments n'héritent pas de View et n'ont donc pas de méthode d'arrière-plan.

Toute solution facile consiste simplement à saisir la vue racine de fragment et à définir son arrière-plan

fragment.getView().setBackgroundColor(Color.WHITE);
35
Adam

La raison pour laquelle cela ne fonctionne pas est que fragment est traité comme une activité. C'est un conteneur qui est l'enfant de l'activité principale et qui est utilisé pour afficher d'autres éléments.

Vous devez mettre Android: background = "# CBA" dans la présentation actuelle contenant le TextView et PAS le fragment lui-même .

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#CBA"
    Android:orientation="horizontal" >

    <TextView
        Android:id="@+id/tv"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical"
        Android:text="BLAHHHH" />
</LinearLayout>
7
Brandon Ling

Obtenez l'objet fragment comme:

Fragment fragment = (Fragment) getFragmentManager().findFragmentById(R.id.fragmentId);

Changer c'est le fond comme:

fragment.getView().setBackgroundColor(Color.WHITE);
2
eldhoittangeorge

J'ai rencontré le même problème, mais mon exigence était de définir ou de modifier l'image de fragment pouvant être dessinée à l'arrière-plan. Comme Adam a répondu, l'approche est correcte et je voudrais montrer le lien entre fragment et activité.

La meilleure pratique consiste à utiliser une interface nommée 'Connector' (ou n'importe quel nom) .Puis de votre fragment:

Connector connector = (Connector) getActivity();
connector.setIt(this);

Ensuite, dans votre activité, qui implémentera l'interface 'Connector' et utilisera la méthode.

@Override
public void setIt(Fragment fragment){
    FirstFragment firstFrag = (FirstFragment) getSupportFragmentManager().findFragmentByTag("first");
    firstFrag.getView().setBackgroundDrawable(getResources().getDrawable(R.drawable.app_background));
    //or for color set
    firstFrag.getView().setBackgroundColor(Color.WHITE);
}
0
Asad