2012-07-27 28 views
20

Intenté cambiar el color de fondo de un fragmento, pero se produjo un pequeño problema.Android: Cambiar el color de fondo del fragmento

public class MainActivity extends FragmentActivity { 

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

Así, se muestra por encima de es el código que tenía para mi clase principal que llama al archivo XML para el fragmento.

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

Por encima de es la disposición main.xml que es llamado por la clase principal (MainActivity).

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

Por encima de el archivo XML con el fragmento llama a esta clase.

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

Esta disposición anterior es inflado por el FirstFragment clase

Así que, ¿por qué no esto realmente cambia el color del fondo de mi fragmento?

Respuesta

32

fragmentos no heredar de vista y por lo tanto no tienen un método fondo conjunto.

Cualquier solución fácil es simplemente grab the root view del fragmento y establecer su fondo

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

Gracias que resolvió mi problema, pero en vez de getView() Utilicé getRootView(): fragment.getRootView(). setBackgroundColor (Color.WHITE); – zarej

+0

Obtengo una NullPointerException cuando pruebo esto en un PreferenceFragment = s – Solace

7

La razón por la que eso no funciona es porque el fragmento se trata de manera similar a una actividad. Es un contenedor que es el elemento secundario de la actividad principal y se usa para mostrar otros elementos.

Debe colocar el android: background = "# CBA" en el diseño actual que contiene el TextView y NO el fragmento en sí. Al igual que :

<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

Esto se aplicará a la actividad en conjunto y no un fragmento específico –

0

me he enfrentado el mismo problema pero mi obligación era para establecer o cambiar la imagen de fondo del fragmento estirable. Como Adam respondió, el enfoque es correcto y me gustaría mostrar la conexión de fragmento a actividad.

La mejor práctica es utilizar una interfaz llamada 'Conector' (o cualquier nombre) .A continuación de su fragmento:

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

Luego, en su actividad que implementar la interfaz 'Conector' y tienen el método.

@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

obtener el objeto fragmento como:

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

cambiar su fondo como:

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