夜间模式
来源:互联网 发布:睿博数据招聘 编辑:程序博客网 时间: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
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- ViewPager控制滑动问题
- Android中使用gzip传递数据
- 蓝牙音箱方案集合
- jQuery动态增加表格,增加行,并添加ID
- Android框架浅析之锁屏(Keyguard)机制原理
- 夜间模式
- Android—构建安全的Android客户端请求,避免非法请求
- Leetcode Read N Characters Given Read4 (I,II同一款程序)
- Android通过共享用户ID来实现多个Activity进程共享
- Android Alarm自上而下 调试浅析
- codeforces 380C 线段树括号匹配
- TI低功耗蓝牙(BLE)介绍
- VS2010 编译时老出现“Failed to load and parse the manifest”怎么解决?
- Rails 3 与 Rails 4 中 try 方法的不同