更改片段中的颜色

时间:2016-03-30 01:11:31

标签: java android android-fragments

在我的应用程序中,片段包含一些LinearLayout(例如id为LL1)。如何更改LL1背景颜色? 我想通过Fragment.java中的OnCreate中的sharedpreferences(有两个值:alpha和color)来实现它:

SharedPreferences pref = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
getView().findViewById(R.id.LL1).setBackgroundColor(Color.parseColor(pref.getString(TRANSP_KEY, "#CC") + pref.getString(FCOLOR_KEY, "5556FF")));

没有错误,但是当我尝试启动应用程序时:

Unfortunately application has stopped

我试过了:

LinearLayout LL= (LinearLayout) getView().findViewById(R.id.LL1);
LL.setBackgroundColor(Color.WHITE);

但是存在同样的问题

可能setbackground不起作用,如果它被删除应用程序工作,但有默认颜色(来自xml文件)。

我做错了什么?

fragment.java:

package com.hgyghyfghyu.apkana40;


import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import static com.hgyghyfghyu.apkana40.AppData.FCOLOR_KEY;
import static com.hgyghyfghyu.apkana40.AppData.TRANSP_KEY;
import static com.hgyghyfghyu.apkana40.AppData.prefdata;
import static com.hgyghyfghyu.apkana40.UserData.editor;
import static com.hgyghyfghyu.apkana40.UserData.pref;


/**
 * A simple {@link Fragment} subclass.
 */
public class TrainerMenu extends Fragment {


    public TrainerMenu() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        SharedPreferences pref = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

        LinearLayout imageView = (LinearLayout) getView().findViewById(R.id.trainermenutrainersbtn);
        imageView.setBackgroundColor(Color.WHITE);
       // getView().findViewById(R.id.trainermenuadbtn).setBackgroundColor(Color.parseColor(pref.getString(TRANSP_KEY, "#CC") + pref.getString(FCOLOR_KEY, "33777F")));

        //getView().findViewById(R.id.trainermenusettingsbtn).setBackgroundColor(Color.parseColor(pref.getString(TRANSP_KEY, "#CC") + pref.getString(FCOLOR_KEY, "5556FF")));
       // getView().findViewById(R.id.trainermenuinfobtn).setBackgroundColor(Color.parseColor(pref.getString(TRANSP_KEY, "#CC") + pref.getString(FCOLOR_KEY, "5556FF")));
        //getView().findViewById(R.id.trainermenugroupsbtn).setBackgroundColor(Color.parseColor(pref.getString(TRANSP_KEY, "#CC") + pref.getString(FCOLOR_KEY, "5556FF")));


        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_trainer_menu, container, false);
    }

}

2 个答案:

答案 0 :(得分:1)

  

我想在片段中的OnCreate中执行此操作:

嗯,你不能。 getView()将在onCreate内返回空视图,因为尚未创建视图。

请在为片段的布局XML膨胀后将代码移至onCreateView,并在已膨胀的视图上使用findViewById,而不是使用getView()

代码

View v = inflater.inflate(R.layout.fragment_trainer_menu, container, false);
v.findViewById... 
return v;

答案 1 :(得分:0)

引用getView()方法的文档:

  

public View getView ()

     

获取片段布局的根视图(返回的布局)   onCreateView(LayoutInflater, ViewGroup, Bundle)),如果提供的话。

     

返回视图片段的根视图,如果没有布局,则返回null。

因此,如果您尝试在getView() :)之前使用onCreateView()访问Fragment的布局,它将无法工作。以下是接近此问题的一种方法,因为在onViewCreated()之后立即调用onCreateView()

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_trainer_menu, container, false);
}

@Override
public void onViewCreated (View view, Bundle savedInstanceState) {

    SharedPreferences pref = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

    LinearLayout imageView = (LinearLayout) view.findViewById(R.id.trainermenutrainersbtn);
    imageView.setBackgroundColor(Color.WHITE);
}