夜间模式

来源:互联网 发布:睿博数据招聘 编辑:程序博客网 时间:2024/05/17 02:25

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

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

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)然后操作组件。

0 0
原创粉丝点击