夜间模式

新项目准备时期,我作为副手配合主程来进行代码编写,主程给我的任务就是做个夜间模式,仿网易新闻那样的就行。

谷歌百度了几天,发现网上的资料大概以下这三个解决方案:

1、attr+style,然后用setTheme()来以设置主题的方式切换。

优点:操作简单,逻辑也很容易写明白。

缺点:当前页面和未销毁的页面想要切换必须重新加载,因为setTheme()方法必须在setContentView(layoutId)之前执行。

2、UI组件setBackgroudColor/Drawable。

优点:及时性,不需要刷新页面。

缺点:虽然就日间跟夜间两套布局,但是如果程序页面很多,并且布局复杂,就很苦逼了。

3、我看有前辈说自定义组件,通过改变组件的AttributeSet,来达到切换的目的。

这个我没搞出来。囧。。。

我的方法
(接下来说说我的方法,如果有不对之处,还请大神们指出来,我写的是测试demo,页面比较少,如果各位运用到实际项目出了来问题请给我留言,我会及时写出,以免让别人也遇到问题耽误时间,谢谢。)
想法
我看网易新闻的夜间模式是类似上面的第2个办法,及时,而且没有重新加载页面,样式整齐,只改变了标题的颜色,别的颜色本来就是偏淡灰色,这样修改的部分比较少。如果想改变一个组件的背景,或者文字,或者文字颜色,首先要找到它,我们一般运用findViewById(),然后通过对象去改变它的背景。组件的ID是唯一标示符,只要找到这个ID就可以操作这个组件,那么,组件还有一个标示符,它叫做tag,速度不如id速度,但是也有标示作用,我就想,那这样我是不是可以把我想改变的组件设置为同一个tag,这样程序显示这一页的时候,只要有这个tag的组件就改变它的属性,理论上,我觉得是可行的,就开始操作。
布局xml
main.xml
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"
                    android:orientation="vertical"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:tag="@string/linearLayout"
                  android:gravity="center"
                  android:id="@+id/linearlayout">
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="下一页"
                android:id="@+id/button1"
                android:textColor="@android:color/black"
                android:background="@android:color/darker_gray"
                android:layout_marginTop="10dp"/>
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                android:layout_marginTop="10dp"
                android:text="@string/day"
                android:tag="@string/button"/>
    </LinearLayout>
layout1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:tag="@string/linearLayout"
        android:gravity="center_horizontal">
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="下一页"
            android:id="@+id/button"/>
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/white"
            android:layout_marginTop="10dp"
            android:text="@string/day"
            android:tag="@string/button"/>
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@string/day"
            android:tag="@string/textview"/>
    <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/listView"/>
</LinearLayout>

layout2.xml
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:tag="@string/linearLayout">
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="切换模式"
            android:id="@+id/button"/>
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/white"
            android:layout_marginTop="10dp"
            android:text="@string/day"
            android:tag="@string/button"/>
</LinearLayout>
value文件下
color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="white">#ffffff</color>
    <color name="black">#000000</color>
</resources>
string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SetThemeStyleDemo</string>
    <string name="day">我是白天的</string>
    <string name="night">我是夜间的</string>
    <string name="button">button</string><!--button的tag-->
    <string name="textview">textview</string><!--textview的tag-->
    <string name="linearLayout">linearLayout</string><!--布局的tag-->
</resources>
Java代码
MyActivity(主Activity)
public class MyActivity extends Base {
    private View layout = null;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        layout = getLayoutInflater().inflate(R.layout.main, null);
        setContentView(layout);
        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MyActivity.this,Activity1.class));
            }
        });
    }


    @Override
    protected void onStart() {
        super.onStart();
        setAppTheme(layout);
    }
}
Activity1
public class Activity1 extends Base {
    private List<String> arrayList = new ArrayList<String>();
    private ListView listView = null;
    private View layout = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        layout = getLayoutInflater().inflate(R.layout.layout1, null);
        setContentView(layout);
         listView = (ListView) findViewById(R.id.listView);
        for (int i = 0; i < 20; i++) {
            arrayList.add("item : " + i);
        }
        listView.setAdapter(new MyAdapter());
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(Activity1.this, Activity2.class));
            }
        });


    }


    @Override
    protected void onStart() {
        super.onStart();
        setAppTheme(layout);
    }


    class MyAdapter extends BaseAdapter {


        @Override
        public int getCount() {
            return arrayList.size();
        }


        @Override
        public Object getItem(int position) {
            return arrayList.get(position);
        }


        @Override
        public long getItemId(int position) {
            return 0;
        }


        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.item, null);
            }
            TextView textView = (TextView) convertView.findViewById(R.id.text);
            textView.setText( arrayList.get(position));
            return convertView;
        }
    }
}

Activity2
public class Activity2 extends Base {
    private View layout = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        layout = getLayoutInflater().inflate(R.layout.main, null);
        setContentView(layout);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (preferences.getString("isDay", "false").equals("true"))
                    editor.putString("isDay", "false");
                else
                    editor.putString("isDay", "true");
                editor.commit();
                setAppTheme(layout);
            }
        });
    }


    @Override
    protected void onStart() {
        super.onStart();
        setAppTheme(layout);
    }
}

Base
public class Base extends Activity {
    protected SharedPreferences preferences = null;
    protected SharedPreferences.Editor editor = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        preferences = getSharedPreferences("demo",MODE_PRIVATE);
        editor = preferences.edit();
        if (preferences.getString("isDay", "").equals("")) {
            editor.putString("isDay", "true");
            editor.commit();
        }
    }


    protected void setAppTheme(View view) {
        if (preferences.getString("isDay", "false").equals("true")) {
            LinearLayout linearLayout= (LinearLayout)view.findViewWithTag(getString(R.string.linearLayout));
            linearLayout.setBackgroundColor(getResources().getColor(R.color.white));
            if (view.findViewWithTag(getString(R.string.textview))!=null){
                ((TextView)view.findViewWithTag(getString(R.string.textview))).setText(getResources().getString(R.string.day));
                ((TextView)view.findViewWithTag(getString(R.string.textview))).setTextColor(getResources().getColor(R.color.black));
            }
            if (view.findViewWithTag(getString(R.string.button))!=null){
                ((Button)view.findViewWithTag(getString(R.string.button))).setText(getResources().getString(R.string.day));
                ((Button)view.findViewWithTag(getString(R.string.button))).setTextColor(getResources().getColor(R.color.black));
            }
        }else {
            LinearLayout linearLayout= (LinearLayout) view.findViewWithTag(getString(R.string.linearLayout));
            linearLayout.setBackgroundColor(getResources().getColor(R.color.black));
            if (view.findViewWithTag(getString(R.string.textview))!=null){
                ((TextView)view.findViewWithTag(getString(R.string.textview))).setText(getResources().getString(R.string.night));
                ((TextView)view.findViewWithTag(getString(R.string.textview))).setTextColor(getResources().getColor(R.color.white));
            }
            if (view.findViewWithTag(getString(R.string.button))!=null){
                ((Button)view.findViewWithTag(getString(R.string.button))).setText(getResources().getString(R.string.night));
                ((Button)view.findViewWithTag(getString(R.string.button))).setTextColor(getResources().getColor(R.color.white));
            }
        }
    }
}

OK,代码全贴上了,就是一个主Activity跳到Activity1,1在跳到2,Activity2上有个切换模式的按钮,点击后切换到另外一个模式。没什么难点,主要就是在xml文件里设置tag属性,然后调用View.findViewWithTag(Object tag)然后操作组件。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值