2012-07-27 4 views
20

Ich versuchte, die Hintergrundfarbe eines Fragments zu ändern, aber ein kleines Problem trat auf.Android: Ändern der Hintergrundfarbe des Fragments

public class MainActivity extends FragmentActivity { 

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

So oben gezeigt, ist der Code, den ich für meine Hauptklasse hatte, die die XML-Datei für das Fragment nennt.

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

Above ist das main.xml Layout, das von der Hauptklasse (MainActivity) genannt wird.

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

Above die XML-Datei mit dem Fragment nennt diese Klasse.

<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 oben durch die Klasse FirstFragment aufgeblasen wird

Also, warum sich das ändern die Farbe des Hintergrundes meines Fragment eigentlich nicht?

Antwort

32

Fragmente aus View erben nicht und somit keinen Satz Hintergrund Methode haben.

ist Jede einfache Lösung grab the root view des Fragments auf angemessene und seinem Hintergrund

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

Dank, dass mein Problem gelöst, sondern von getView() Ich habe getRootView() verwendet: fragment.getRootView(). setBackgroundColor (Color.WHITE); – zarej

+0

Ich bekomme eine NullPointerException, wenn ich dies auf einem PreferenceFragment = s versuche – Solace

7

Der Grund, warum das nicht funktioniert, ist, weil Fragment ähnlich wie eine Aktivität behandelt wird. Es ist ein Container, der das Kind der Hauptaktivität ist und zum Anzeigen anderer Elemente verwendet wird.

Sie müssen das Android: Hintergrund = "# CBA" in das tatsächliche Layout, das die TextView und nicht das Fragment selbst enthält. Wie so:

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

Diese auf ganze Aktivität gelten und nicht ein spezifisches Fragment –

0

ich das gleiche Problem konfrontiert, aber meine Anforderung war zu setzen oder Hintergrund ziehbar Bild Fragment zu ändern. Als Adam antwortete, ist der Ansatz richtig und ich möchte die Verbindung von Fragment zu Aktivität zeigen.

Die beste Vorgehensweise ist es, eine Schnittstelle mit dem Namen ‚Connector‘ (oder einem beliebigen Namen) .Dann von Ihrem Fragmente zu verwenden:

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

Dann in Ihrer Tätigkeit, die Schnittstelle ‚Connector‘ wird implementieren und das Verfahren hat.

@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

das Fragment Objekt wie Get:

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

ändern ist es Hintergrund wie:

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