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?
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);
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>
Obtenez l'objet fragment comme:
Fragment fragment = (Fragment) getFragmentManager().findFragmentById(R.id.fragmentId);
Changer c'est le fond comme:
fragment.getView().setBackgroundColor(Color.WHITE);
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);
}