新项目准备时期,我作为副手配合主程来进行代码编写,主程给我的任务就是做个夜间模式,仿网易新闻那样的就行。
谷歌百度了几天,发现网上的资料大概以下这三个解决方案:
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)然后操作组件。