更改活动背景颜色并可能为其设置动画

时间:2016-08-30 01:20:07

标签: android android-activity

我在这里找到了这段代码,但我无法让它在我的应用程序中运行

public void setActivityBackground(int color) {
    View v = this.getWindow().getDecorView();
    v.setBackgroundColor(color);
}

我正在尝试在交换机监听器(onCheckedChanged)中实现它,并且我在我的片段中的监听器内调用它

((MainActivity) getActivity()).setActivityBackground(Color.CYAN);

但没有任何反应。可能有什么不对?我可以用这种方式改变这种变化吗?

2 个答案:

答案 0 :(得分:2)

我不确定你的意思是'可能是它的动画'。我假设你想要动画背景颜色的变化。对?这个解决方案并不完全正确,但它可以帮助您了解如何做到这一点。

1)片段布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="app.ola.com.example.FragmentExample">

    <Switch
        android:id="@+id/switchFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

</RelativeLayout>

2)片段类

public class FragmentExample extends Fragment {

private OnCheckedChangeListener mListener;
private Switch switchFragment;

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_fragment_example, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    switchFragment = (Switch)view.findViewById(R.id.switchFragment);
    switchFragment.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if(null != mListener)
                mListener.onCheckChange(b);
        }
    });
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnCheckedChangeListener) {
        mListener = (OnCheckedChangeListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnCheckedChangeListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

public interface OnCheckedChangeListener {
    // TODO: Update argument type and name
    void onCheckChange(boolean b);
}
}

3)活动布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootView"
    android:background="@android:color/white"
    tools:context="app.ola.com.example.MainActivity">

    <FrameLayout
        android:id="@+id/mainContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

4)活动类

public class MainActivity extends AppCompatActivity implements FragmentExample.OnCheckedChangeListener{

private RelativeLayout rootView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    rootView = (RelativeLayout)findViewById(R.id.rootView);

    getSupportFragmentManager().beginTransaction()
            .add(R.id.mainContent, new FragmentExample()).commit();
}

@Override
public void onCheckChange(boolean isChecked) {
    //animate
    if(isChecked){
        ObjectAnimator.ofObject(rootView, "backgroundColor", new ArgbEvaluator(), Color.argb(0, 255, 255, 255), Color.argb(200, 0, 0, 0))
                .setDuration(300)
                .start();
    }
    else{
        ObjectAnimator.ofObject(rootView, "backgroundColor", new ArgbEvaluator(), Color.argb(200, 0, 0, 0), Color.argb(0, 255, 255, 255))
                .setDuration(300)
                .start();
    }
}
}

5)结果

enter image description here

注意

1)您可以在片段类中创建接口,并在Activity类中实现接口,而不是调用((MainActivity) getActivity()).setActivityBackground(Color.CYAN)。这是在fragment-activity之间进行通信的正确方法。您可以参考Android开发者文档以获得简要说明:Communication with other fragments

2)我使用ObjectAnimator为背景颜色的变化设置动画,从白色到黑色,不透明度为78%。 'rootView'是布局活动的父视图。您可以参考活动布局。

答案 1 :(得分:0)

你可以设置方法&#34; setActivityBackground(int color)&#34;作为公共类中的静态,并在fragmengt中将其称为“class.setActivityBackground(Color.CYAN)”,试试吧;