Android: изменить цвет фона фрагмента
Я попытался изменить цвет фона фрагмента, но возникла небольшая проблема.
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Итак, показанный выше - это код, который у меня был для моего основного класса, который вызывает XML файл для фрагмента.
<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>
Над - это макет main.xml, который вызывается основным классом (MainActivity).
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.main, parent, false);
}
}
Над XML файл с фрагментом вызывает этот класс.
<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>
Этот макет выше раздувается классом FirstFragment
Итак, почему это фактически не меняет цвет фона моего фрагмента?
Ответы
Ответ 1
Фрагменты не наследуются от представления и, следовательно, не имеют установленного фонового метода.
Любое легкое исправление заключается в просто захватить корневой вид фрагмента и установить его фон
fragment.getView().setBackgroundColor(Color.WHITE);
Ответ 2
Причина, по которой это не работает, заключается в том, что фрагмент обрабатывается аналогично действию. Это контейнер, который является дочерним элементом основного действия и используется для отображения других элементов.
Вам нужно поместить андроид: background = "# CBA" в фактический макет, который содержит TextView и НЕ сам фрагмент.
Например:
<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>
Ответ 3
Я столкнулся с той же проблемой, но мое требование состояло в том, чтобы установить или изменить фоновое изображение в виде фрагмента. Поскольку Адам ответил, что подход прав, и я хотел бы показать связь от фрагмента к активности.
Лучшей практикой является использование интерфейса с именем "Коннектор" (или любое имя). Затем из вашего фрагмента:
Connector connector = (Connector) getActivity();
connector.setIt(this);
Затем в вашей деятельности, которая будет реализовывать интерфейс Connector и иметь метод.
@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);
}