web-dev-qa-db-de.com

Android: Hintergrundfarbe des Fragments ändern

Ich habe versucht, die Hintergrundfarbe eines Fragments zu ändern, aber es ist ein kleines Problem aufgetreten.

public class MainActivity extends FragmentActivity {

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

Also gezeigt über ist der Code, den ich für meine Hauptklasse hatte, die die XML-Datei für das Fragment aufruft.

<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>

Über ist das main.xml-Layout, das von der Hauptklasse (MainActivity) aufgerufen wird.

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

Über Die XML-Datei mit dem Fragment ruft diese Klasse auf.

<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>

Dieses Layout über wird von der Klasse FirstFragment aufgeblasen

Warum ändert das also nicht die Hintergrundfarbe meines Fragments?

21
Brandon Ling

Fragmente erben nicht von View und haben daher keine Hintergrundmethode.

Eine einfache Lösung besteht darin, nur greifen Sie auf die Stammansicht des Fragments zu und setzen Sie den Hintergrund

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

Der Grund dafür, dass dies nicht funktioniert, liegt darin, dass Fragment ähnlich einer Aktivität behandelt wird. Es ist ein Container, der der Hauptaktivität untergeordnet ist und zur Anzeige anderer Elemente verwendet wird.

Sie müssen Android: background = "# CBA" in das tatsächliche Layout einfügen, in dem sich die Textansicht befindet, und NICHT das Fragment selbst .

<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

Holen Sie sich das Fragment-Objekt wie:

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

Ändern Sie den Hintergrund wie folgt:

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

Ich war mit dem gleichen Problem konfrontiert, aber meine Anforderung bestand darin, das Hintergrundbild des Fragments zu setzen oder zu ändern. Als Adam antwortete, war der Ansatz richtig und ich möchte die Verbindung von Fragment zu Aktivität aufzeigen.

Am besten verwenden Sie eine Schnittstelle mit dem Namen 'Connector' (oder einen beliebigen Namen). Dann aus Ihrem Fragment:

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

Dann wird in Ihrer Aktivität die 'Connector'-Schnittstelle implementiert und die Methode verwendet.

@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