Android每日一文

话不多说先上图:

       

apk下载:百度网盘下载   提取码:l8ry 

用到知识点:

1.WebView布局,并引入html代码让拿到的数据里面的标签生效。

由于刚拿到的数据全是<p>所以显示在WebView布局会乱掉,要想标签生效、首行缩进就要引入html代码了,用法如下:

首先定义html代码:

private static final String WEBVIEW_CONTENT_NIGHT = "<html><head></head><body style=\"text-align:justify;margin:10;text-indent:2em; background: #313639;\">%s</body></html>";
private static final String WEBVIEW_CONTENT_LIGHT = "<html><head></head><body style=\"text-align:justify;margin:10;text-indent:2em; background: #ffffff;\">%s</body></html>";

然后拿到数据并渲染:

wv.loadDataWithBaseURL(null, String.format(WEBVIEW_CONTENT_NIGHT, obj2.getString("content")), "text/html", "utf-8", null);

2.上滑WebView隐藏多余布局。为节省阅读空间在上滑的时候我想要隐藏作者和字数,所以这里就要用OnScrollChangeListener,首先实现OnScrollChangeListener:

然后获取控件并实现监听:

wv = findViewById(R.id.wv);
wv.setOnScrollChangeListener(this);

最后在方法中设置纵向滑动多上距离隐藏布局:

@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        if (scrollY > 100) {
            rl.setVisibility(View.GONE);//隐藏作者
        } else if (scrollY == 0) {
            rl.setVisibility(View.VISIBLE);//显示作者
        }
 }

3.点击两次返回键退出程序。为防止误触,所以设置点击一次返回键提示再按一次退出程序,两次间隔时间两秒。方法如下:

private boolean mBackKeyPressed = false;//记录是否有首次按键

//点击两次退出程序
public void onBackPressed() {
        if (!mBackKeyPressed) {
            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
            mBackKeyPressed = true;
            new Timer().schedule(new TimerTask() {//延时两秒,如果超出则清除第一次记录

                @Override
                public void run() {
                    mBackKeyPressed = false;
                }
            }, 2000);
        } else {
            //结束Activity
            finish();
        }
 }

4.还有一个是比较常用的全屏显示隐藏状态栏。(一定要加在setContentView()之上)

//去掉Activity上面的状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);

5.底部弹窗并保存ToggleButton的按钮状态(这里用了0和1判断开和关也可用true和flase)根据状态判断是否为夜间模式。

  dialog = new Dialog(this, R.style.ActionSheetDialogStyle);
                //填充对话框的布局
                inflate = LayoutInflater.from(this).inflate(R.layout.dialog, null);
                //获取控件
                tb = inflate.findViewById(R.id.tb);//夜间
                //获取监听
                tb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                            try {
                                wv.loadDataWithBaseURL(null, String.format(WEBVIEW_CONTENT_NIGHT, obj2.getString("content")), "text/html", "utf-8", null);
                                sprfMain = getSharedPreferences("counter", Context.MODE_PRIVATE);
                                editorMain = sprfMain.edit();
                                editorMain.putInt("bg", 0);
                                editorMain.commit();
                                ll.setBackgroundResource(R.color.colorNight);
                                v_x.setBackgroundResource(R.color.colorNight);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        } else {
                            try {
                                wv.loadDataWithBaseURL(null, String.format(WEBVIEW_CONTENT_LIGHT, obj2.getString("content")), "text/html", "utf-8", null);
                                sprfMain = getSharedPreferences("counter", Context.MODE_PRIVATE);
                                editorMain = sprfMain.edit();
                                editorMain.putInt("bg", 1);
                                editorMain.commit();
                                ll.setBackgroundResource(R.color.colorWhite);
                                v_x.setBackgroundResource(R.color.colorLightGray);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
                //取出保存的值
                sprfMain = getSharedPreferences("counter", Context.MODE_PRIVATE);
                bg = sprfMain.getInt("bg", 1);
                if (bg == 0) {
                    tb.setChecked(true);
                } else if (bg == 1) {
                    tb.setChecked(false);
                }
                //将布局设置给Dialog
                dialog.setContentView(inflate);
                //获取当前Activity所在的窗体
                Window dialogWindow = dialog.getWindow();
                //设置Dialog从窗体底部弹出
                dialogWindow.setGravity(Gravity.BOTTOM);
                //获得窗体的属性
                WindowManager.LayoutParams lp = dialogWindow.getAttributes();
                lp.y = 0;//设置Dialog距离底部的距离
                //宽度填满
                lp.width = WindowManager.LayoutParams.MATCH_PARENT;
                //将属性设置给窗体
                dialogWindow.setAttributes(lp);
                dialog.show();//显示对话框
ActionSheetDialogStyle样式文件和弹出动画:
<style name="ActionSheetDialogStyle" parent="@android:style/Theme.Dialog">
        <!-- 背景透明 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <!-- 浮于Activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 边框 -->
        <item name="android:windowFrame">@null</item>
        <!-- Dialog以外的区域模糊效果 -->
        <item name="android:backgroundDimEnabled">false</item>
        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 半透明 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- Dialog进入及退出动画 -->
        <item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item>
    </style>
    <!-- ActionSheet进出动画 -->
    <style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog">
        <item name="android:windowEnterAnimation">@anim/actionsheet_dialog_in</item>
        <item name="android:windowExitAnimation">@anim/actionsheet_dialog_out</item>
    </style>
actionsheet_dialog_in:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="100%"
    android:toYDelta="0" />
actionsheet_dialog_out:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="0"
    android:toYDelta="100%" />
还有dialog布局:(根据自己的布局修改)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorWhite"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="20dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="30dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="60dp"
            android:gravity="center"
            android:text="夜间" />

        <ToggleButton
            android:id="@+id/tb"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_gravity="center"
            android:background="@android:color/transparent"
            android:button="@drawable/btn_backgrounds"
            android:textOff="关"
            android:textOn="开" />
    </RelativeLayout>
</LinearLayout>

最后根据保存的数据判断并显示是否为夜间模式:

//取出保存的值
                        sprfMain = getSharedPreferences("counter", Context.MODE_PRIVATE);
                        bg = sprfMain.getInt("bg", 1);
                        if (bg == 0) {
                            wv.loadDataWithBaseURL(null, String.format(WEBVIEW_CONTENT_NIGHT, obj2.getString("content")), "text/html", "utf-8", null);
                            ll.setBackgroundResource(R.color.colorNight);
                            v_x.setBackgroundResource(R.color.colorNight);
                        } else if (bg == 1) {
                            wv.loadDataWithBaseURL(null, String.format(WEBVIEW_CONTENT_LIGHT, obj2.getString("content")), "text/html", "utf-8", null);
                            ll.setBackgroundResource(R.color.colorWhite);
                            v_x.setBackgroundResource(R.color.colorLightGray);
                        }

详细代码请到GitHub:GitHub - cuiwenju2017/EveryDayIs: 每日一文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
课程设计概述: 本课程设计旨在让学生能够熟悉移动应用开发的基本原理和技术,掌握Android平台下的应用开发技术,了解应用开发的生命周期、UI设计、数据存储、网络通信等方面的知识,通过实践项目的开发,提高学生的应用开发能力和解决问题的能力。 课程设计内容: 本课程设计采用每日一文app为例,通过实践让学生掌握以下技术: 1. Android基础知识:Android平台的体系结构、应用架构、应用生命周期、UI设计等基础知识。 2. 数据存储:SQLite数据库的使用、SharedPreferences的使用等。 3. 网络通信:HTTP协议的使用、Volley库的使用等。 4. 多线程编程:异步任务的使用、Handler的使用等。 5. 第三方库的使用:Glide图片加载库的使用、ButterKnife注解库的使用等。 6. 项目实践:通过每日一文app的实践,让学生掌握应用开发的实际应用场景和解决问题的能力。 课程设计目标: 通过本课程设计,学生应该能够: 1. 掌握Android平台下应用开发的基础知识和技能。 2. 熟练运用Android SDK和第三方库进行应用开发。 3. 能够独立完成一个简单的Android应用的设计和开发。 4. 具备分析和解决应用开发中遇到的问题的能力。 5. 培养学生的团队协作和沟通能力。 6. 提高学生的创新意识和实际问题解决能力。 课程设计教学方法: 本课程设计采用“理论教学 + 实践操作”的教学方法。理论教学主要讲解Android应用开发的基本原理和技术,实践操作则通过每日一文app的开发实践,让学生深入了解应用开发的实际应用场景和解决问题的能力。 同时,本课程设计还将采用小组协作的教学方法,让学生在团队中相互协作、交流,提高团队协作和沟通能力。 评价方法: 本课程设计的评价方式采用实践考核和项目报告两种方式。实践考核主要考察学生的应用开发能力和解决问题的能力,项目报告则主要考察学生对应用开发技术的理解和应用能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

举儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值