精华内容
下载资源
问答
  • 时间轴这个功能可以把过去的事物更系统化、完整化、精确化的记录下来,时间轴app哪个好?可以记录自己过去经历的时间轴便签是哪款? 我平时在工作、学习和生活中,非常喜欢随手记录下来自己遇到的事情或者是自己需要...

    时间轴是根据时间的顺序,把一个或多个事件联系起来,从而形成比较完整的记录体系。时间轴这个功能可以把过去的事物更系统化、完整化、精确化的记录下来,时间轴app哪个好?可以记录自己过去经历的时间轴便签是哪款?

    我平时在工作、学习和生活中,非常喜欢随手记录下来自己遇到的事情或者是自己需要做的事情。这样做的好处是,能够很好的记录自己的生活,同时也可以让自己对未来的事情规划更加有条理。

    在使用便签软件APP记录任务计划的时候,如果任务已经完成很多人会选择删掉这一条,但是有的便签软件删掉内容之后就无法找回,日后再想查看就没有办法了。所以我的选择是使用敬业签这款有时间轴功能的便签app。

    在这里插入图片描述

    敬业签的时间轴功能可以有效提高自己的容错率,因为在时间轴中记录了自己账号从使用第一天至今所有的新增、修改和删除的内容,不管是可以删除还是误删的内容都可以找回,同时还可以查看自己过往记录过所有事情的创建时间、在哪个端进行的操作等信息。

    有了这个时间轴功能,就可以很好的查看自己过去记录过的经历,为自己回忆之前的事情提供了很好的依据。时间轴这个功能可以在敬业签的苹果手机端、安卓手机端、iPad端、Mac端、Windows系统PC端和web网页端上使用,非常的方便,无论身在何处,都可以通过身边的设备来查看时间轴内容。

    展开全文
  • 时间轴综合日程管理类APP
  • 5款App帮你创建时间轴

    千次阅读 2017-09-06 14:26:00
    一个时间轴有很多理由。你可能希望创建一个关于如何展开项目和运作公司的时序图,追踪家族史,或者记录你职业生涯的进步轨迹。但不管是什么原因,你都需要一个合适的工具来让这个时间轴易于使用。你不能只是用一个...

    做一个时间轴有很多理由。你可能希望创建一个关于如何展开项目和运作公司的时序图,追踪家族史,或者记录你职业生涯的进步轨迹。但不管是什么原因,你都需要一个合适的工具来让这个时间轴易于使用。你不能只是用一个电子表格或者文本文档来创建一个有用的互动工具。相反,你需要合适的软件来完成这项工作。

    我发现了5款应用可以很好地创建时间轴,不管是针对什么用途。有些是移动应用,有些是网站服务,不管你的需求是什么,相信这个名单都可以覆盖到。

    1、Timeglider

    Timeglider(图A)是一个提供免费和付费账户的网站。Timeglider使用HTML5帮助你创建以数据为驱动的互动时间轴。时间轴上的事件可以包括描述、图像、链接、音频、视频、标签、重要性等等。你只要双击就可以创建一个事件,甚至可以从你计算机上的文件管理器中拖拽图像。

    5款App帮你创建时间轴

    图A

    Timeglider允许你缩放时间轴并改变事件的重要性。如果是付费账户,你可以在时间轴上进行协同工作。一旦完成了这个时间轴,你可以分享并嵌入它。付费版本有另一个方便的功能就是生成一个图例,有利于在时间轴上导航。付费账户从基础计划的每月5美元,到群组账户(5个用户)的每月24美元。有关定价的更多信息,请查看Timeglider的价格列表。

    2、RWT Timeline

    RWT Timeline(图B)是一款免费的安卓和iOS应用,允许你创建基本的时间轴。这些时间轴不是交互式的或者全面的,但是创建非常简单,而且你可以在时间轴上轻松地拖拽条目以便轻松转移。

    5款App帮你创建时间轴

    图B

    利用RWT Timeline你可以自动地将日期添加到事件。相反,你必须添加日期到描述中。但是因为时间并不是锁定于特定时间的,所以时间轴会非常灵活。RWT Timeline允许你将时间轴(后续进行编辑)以.rwt格式保存时间轴。完成之后,你可以将时间轴作为JPG图像导出,根据需要与任何你想分享的人分享。

    3、Tiki-Toki

    Tiki-Toki(图C)是最令人印象深刻的Web时间轴工具。用这款工具你可以创建好看的、交互式的3D或者2D时间轴,可以包括背景图片,“故事”(时间轴上的条目)、多媒体、额外信息等类别。Tiki-Toki很好的一个功能是,它允许你在时间轴内播放多媒体(不需要退出标签或者窗口)。

    5款App帮你创建时间轴

    图C

    这款应用有免费应用和付费应用。通过付费账户,你可以在站点上嵌入时间轴并且与其他人协同。付费账户包括教师账户(每年125美元,包括50个学生账户、嵌入式时间轴,没有广告,只针对教师),以及青铜账户(每月7.5美元,包括5个时间轴、群组编辑、嵌入、每月5000个内嵌查看以及没有广告)。

    4、Capzles

    Capzles(图D)提供了创建时间轴的一个独特且创新方式。你可以创建一个时间轴,直接向时间轴内写博客,添加多媒体、上传图片(由单一的缩略图来呈现),等等。你可以为你的Capzles添加主题,添加背景音乐、并在完成之后与其他人分享。Capzles可以作为标准的时间轴工具,也可以作为可以分享并嵌入的互动日记。

    5款App帮你创建时间轴

    图D

    关于添加多媒体需要注意的一点是:你必须直接从你的计算机上传;你不能嵌入视频或者链接。你能做的是向文本(或者博客)内容中添加链接,并且可点击。当你完成Capzles之后,你可以通过链接、电子邮件、嵌入或者RSS源的方式分享时间轴。Capzles是一项免费服务,并不提供像协作这样的高级功能。

    5、myHistro

    myHistro(图E)是一款独特的时间轴应用,因为它专注于位置多于时间。你创建一个用位置标记的故事并且添加事件。当重放故事的时候,和事件信息一起显示的是该事件位置的地图图像。用myHistro你还可以将事件链接到Facebook、添加小测试、作为CSV/PDF/DVD导出,添加Google地图等等。

    5款App帮你创建时间轴

    图E

    你可以将一个故事嵌入到网站,用户可以对你的故事事件作出评论。myHistromyHistro应该更多地被视为一个教育工具,而不仅仅是一个时间轴应用。通过myHistro,你还可以浏览大量公共时间轴。

    值得花时间

    时间轴是一个追踪项目、公司或者生活进展的游泳工具。你可以尝试其中一个工具看看是否能让你在文档或者促销材料上创建另一层,或者只是与朋友分享信息。  

    原文发布时间为:2015年2月6日


    本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网


    展开全文
  • 使用的是SQLite数据库,把记账明细的ID设为自增,然后在时间轴上点击账单想要进行修改删除,我是通过domain包中的record类的个体的()方法获取自增ID。结果获取不到,取到的值都为0,没办法实现删除,修改。 ![图片...
  • Android RecyclerView使用ItemDecoration刻画时间线/时间轴/时光轴timeline在Android开发中时间线/时间轴/时光轴现在很常见,尤其涉及到进度、物流信息、进展和时态发展的图表信息等,时间线/时间轴/时光轴生动表现...
    Android RecyclerView使用ItemDecoration刻画时间线/时间轴/时光轴timeline


    在Android开发中时间线/时间轴/时光轴现在很常见,尤其涉及到进度、物流信息、进展和时态发展的图表信息等,时间线/时间轴/时光轴生动表现这一类需求。
    在RecyclerView的基础上,我使用ItemDecoration刻画一条在RecyclerView左侧的时间线/时间轴/时光轴。运行结果如图:


    在顶部显示一张与众不同的icon,区别表示事件或者进展已经完成。
    下面是代码。

    RVActivity.java是本例运行的Activity:

    package zhangphil.test;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    
    public class RVActivity extends AppCompatActivity {
        RecyclerViewAdapter mAdapter;
        private ArrayList<Integer> mItems;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.rv_activity);
    
            mItems = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                mItems.add(i);
            }
    
            RecyclerView mRecyclerView = findViewById(R.id.recycler_view);
            LinearLayoutManager layoutManager = new LinearLayoutManager(this);
            layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            mRecyclerView.setLayoutManager(layoutManager);
    
            mAdapter = new RecyclerViewAdapter();
            mRecyclerView.setAdapter(mAdapter);
    
            mRecyclerView.addItemDecoration(new RVItemDecoration(getApplicationContext()));
        }
    
        private class RecyclerViewAdapter extends RecyclerView.Adapter<MyVH> {
    
            @NonNull
            @Override
            public MyVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.rv_item, parent, false);
                return new MyVH(view);
            }
    
            @Override
            public void onBindViewHolder(@NonNull MyVH holder, int position) {
                holder.title.setText("时间:" + position);
                holder.content.setText("事件进度 -> " + mItems.get(position));
                holder.indicator_icon.setImageResource(position == 0 ? R.mipmap.ic_launcher : R.drawable.ic_launcher_background);
            }
    
            @Override
            public int getItemCount() {
                return mItems.size();
            }
        }
    
        private class MyVH extends RecyclerView.ViewHolder {
            public TextView title;
            public TextView content;
            public ImageView indicator_icon;
    
            public MyVH(View itemView) {
                super(itemView);
                title = itemView.findViewById(R.id.title);
                content = itemView.findViewById(R.id.content);
                indicator_icon = itemView.findViewById(R.id.indicator_icon);
            }
        }
    
        private class RVItemDecoration extends RecyclerView.ItemDecoration {
    
            private Paint mPaint;
    
            public RVItemDecoration(Context context) {
                mPaint = new Paint();
                mPaint.setAntiAlias(true);
                mPaint.setStrokeWidth(2); //时间轴线的宽度。
                mPaint.setColor(Color.BLUE); //时间轴线的颜色。
            }
    
            @Override
            public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
                super.onDraw(c, parent, state);
    
                int childCount = parent.getChildCount();
    
                for (int i = 0; i < childCount; i++) {
                    View view = parent.getChildAt(i);
    
                    //int index = parent.getChildAdapterPosition(view);
    
                    float left = dip2px(getApplicationContext(), 14 + 10);
                    float bottom = view.getBottom();
    
                    c.drawLine(left, dip2px(getApplicationContext(), (50 - 20) / 2), left, bottom, mPaint);
                }
            }
        }
    
        public static int dip2px(Context context, float dpValue) {
            float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dpValue * scale + 0.5f);
        }
    }


    其中R.layout.rv_activity.xml:

    <?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:orientation="horizontal">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </LinearLayout>

    其实就只有一个Android的RecyclerView。


    RecyclerView的Adapter用到的item布局R.layout.rv_item.xml:

    <?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="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="14dp"
        android:paddingRight="14dp">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:id="@+id/indicator_icon"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_gravity="center_vertical"
                android:scaleType="centerInside"
                android:src="@drawable/ic_launcher_background" />
    
            <TextView
                android:id="@+id/title"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginLeft="10dp"
                android:background="@android:color/holo_blue_bright"
                android:gravity="left|center_vertical"
                android:text="时间"
                android:textColor="@android:color/white"
                android:textSize="26dp" />
    
        </LinearLayout>
    
        <TextView
            android:id="@+id/content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="6dp"
            android:layout_marginLeft="30dp"
            android:text="事件进度"
            android:textColor="@android:color/darker_gray"
            android:textSize="14dp" />
    
    </LinearLayout>
    


    展开全文
  • Android小项目——新闻APP

    万次阅读 多人点赞 2019-02-26 19:25:42
    在公司学习了一段时间Android知识,决定一个小项目,目的是学会运用所学的基础知识,在这里记录一下开发历程,大家可以把它看成一款入门级练手的 Demo 应用吧~ 项目介绍: 类型: 新闻APP(低仿今日头条) ...

    前言:

     在公司学习了一段时间Android知识,决定做一个小项目,目的是学会运用所学的基础知识,在这里记录一下开发历程,大家可以把它看成一款入门级练手的 Demo 应用吧~

    项目概述:

    类型:

    新闻APP(低仿今日头条)

    基本功能:

    欢迎页面加载(3s,点击可跳过)——Activity相关

    用户注册/登录 ——SQLite运用

    横向滑动列表显示新闻类别——TabLayout、ViewPager、FragmentPagerAdapter的应用

    底部菜单栏 切换——Fragment运用

    –-主页(显示新闻列表)——ListView

    –-设置(退出应用、退出登录、清空缓存)——Activity管理、SharePreference

    –-我的(账号安全、新闻收藏夹)——SQLite

    新闻列表下拉、上滑实现刷新——自定义ListView

    逐条收藏新闻、删除新闻——SharePreference

    仿UI界面——各类控件运用

    点击查看新闻详情 —— WebView

    用户界面更换头像功能——Android运行时权限、多媒体、Content Provider

     

    源码及下载地址:

    https://download.csdn.net/download/qq_34149526/10977199

    PS:

    最近有不少朋友反馈程序闪退问题,我查看了一下,是因为我采用的数据接口(天行数据)请求下来的数据中,图片链接的数据为空(之前一直是正常数据),导致解析图片时空指针异常,最终程序闪退。json数据如下:

    {
    	"code": 200,
    	"msg": "success",
    	"newslist": [{
    		"ctime": "2019-07-18 00:00",
    		"title": "空间科学卫星:迈向空间科学强国",
    		"description": "新华科技",
    		"picUrl": "",--------------->此处为空!!!
    		"url": "http:\/\/www.xinhuanet.com\/tech\/2019-07\/18\/c_1124767044.htm"
    	},
        ……
    }

    修改方法一:替换含有图片数据接口,可采用聚合数据等(使用自行百度),注意修改代码中的数据字段名!!!

    修改方法二:在代码中解析图片的地方加上非空校验,程序不会崩溃,但是新闻列表中不会显示图片。

    修改方法三:自行想办法解决~哈哈

    下面简单贴一下修改方法二:
    
    //针对以下几个类做非空校验,希望大家以我为鉴,养成良好编码习惯。
    
    1、MyBitmapUtils.java:
    public Bitmap getBitmap(String url) {
            if(TextUtils.isEmpty(url)){
                return null;
            }
            Bitmap bitmap;
         ……
    }
    2、HttpUtils.java:
    public static Bitmap decodeUriAsBitmapFromNet(String imgUrl) {
            if(TextUtils.isEmpty(imgUrl)){
                return null;
            }
            URL fileUrl = null;
            Bitmap bitmap = null;
         ……
    }
    3、NewsAdapter.java:
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
         ……
    
         if(news.getNews_img()!=null) {
            viewHolder.newsImg.setImageBitmap(news.getNews_img());
         }
         ……
    }
    4、NetCacheUtils.java:
    private Bitmap downLoadBitmap(String url) {
         ……
            } finally {
                if (conn != null) {
                    conn.disconnect();
                }
            }
         ……
        }

            关于界面无法显示内容,原因是我申请的天行数据的API接口调用次数已用完(当时我是有10万次的免费调用次数,不得不感叹你们的强大),具体解决方法是更换TechFragment、MiliFragment、SportFragment、EnteFragment四个类里面的url地址,原地址已无法正常请求数据。可以自己去天行数据申请免费接口,替换即可(具体url格式参考天行数据官方文档,我已经很久不用它了)。

    在这里我再贴出一位评论区小伙伴 “qq_41835735”给出的解决方案,给大家一个参考。

    ----------华丽分割线----------

    下面进入重点,开始介绍这个项目

    1、项目结构:

    类文件:

    资源文件:

    2、主要功能及其代码实现:

    欢迎页面:(持续时间为3s);

    利用handler机制并开启一个线程,实现展示欢迎页面3s后页面跳转;

     final Message message = new Message();
        final Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    message.what = 1;
                    handler.sendMessage(message);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

    欢迎页面加载完毕后会判断是否有用户登录,若没有用户登录,会跳转到注册&登录页面

    final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1) {
                    //判断用户是否登录
                    boolean userIsLogin = (boolean) SharedPreUtil.getParam(WelcomeActivity.this,
                            SharedPreUtil.IS_LOGIN, false);
                    if (userIsLogin) {
                        Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
                        startActivity(intent);
                    } else {
                        Intent intent = new Intent(WelcomeActivity.this, LoginOrRegisterActivity.class);
                        startActivity(intent);
                    }
    
                    finish();
                } else if (msg.what == 0) {
                    thread.interrupt();
                }
    
            }
    
        };

     注册或登录页面:

                 

     “注册”和“登陆”功能的实现主要是应用的SQLite数据库存储技术;

    注册——存

    SQLiteDatabase db = dbHelper.getWritableDatabase();
    
                        String username_str = username.getText().toString();
                        String userpassword_str = userpassword.getText().toString();
                        String repassword_str = repassword.getText().toString();
    
                        if (userpassword_str.equals(repassword_str)) {
                            ContentValues values = new ContentValues();
                            //组装数据
                            values.put("name", username_str);
                            values.put("password", userpassword_str);
    
                            db.insert("User", null, values);
    
                            startActivity(new Intent(RegisterActivity.this, LoginActivity.class));
                            finish();
                        }

    登陆——取

     if (cursor.moveToFirst()) {
                            String userpassword_db = cursor.getString(cursor.getColumnIndex("password"));
                            if (userpassword_str.equals(userpassword_db)) {
                                SharedPreUtil.setParam(LoginActivity.this, SharedPreUtil.IS_LOGIN, true);
                                SharedPreUtil.setParam(LoginActivity.this, SharedPreUtil.LOGIN_DATA, username_str);
                                //user.setUsername(username_str);
                                //user.setPassword(userpassword_str);
                                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                TimeCount.getInstance().setTime(System.currentTimeMillis());
                                startActivity(intent);
                                finish();
                            } else {
                                Toast.makeText(LoginActivity.this, "密码错误,请重新登录", Toast.LENGTH_SHORT).show();
                            }
                        }

    另外在实现“注册”中上传头像功能时涉及到一个小知识点——运行时权限;因为要访问图库:

    若用户不选择上传,程序会默认使用一个给定好的图片作为用户头像。

    @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            switch (requestCode) {
                case 1:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        openAlbum();
                    } else {
                        Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                    }
                    break;
            }
        }
    
        private void openAlbum() {
            Intent intent = new Intent("android.intent.action.GET_CONTENT");
            intent.setType("image/*");
            startActivityForResult(intent, CHOSSE_PHOTO);
        }
    
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode) {
                case CHOSSE_PHOTO:
                    if (resultCode == -1) {
                        String imgPath = AlbumUtil.handleImageOnKitKat(this, data);
                        setHead(imgPath);
                    }
                    break;
                default:
                    break;
            }
        }

    用户注册登陆后,即进入主页面:默认为科技新闻,左右滑动即可切换新闻类别;

    新闻列表的显示原理及ListView、数据源与Adapter三者相结合,呈现出该画面;

        final String url = "http://api.tianapi.com/keji/?key=7d829a4176fef4ad7409c2dc129905ed&num=30";
        private View view;
        private LoadListView mListView;
        private List<News> newsList;
    
        private NewsAdapter adapter;

    其中数据源的获取涉及到了HTTPClient的GET请求网络资源以及解析json数据的相关知识;

     JSONObject jsonObject = new JSONObject(jsonData);
                JSONArray jsonArray = jsonObject.getJSONArray("newslist");
                for (int i = 0; i < 10; i++) {
                    JSONObject json_news = jsonArray.getJSONObject(i);
                    String imgUrl = json_news.getString("picUrl");
                    /**
                     * 采取三级缓存策略加载图片
                     */
    
                    Bitmap bitmap = myBitmapUtils.getBitmap(imgUrl); 
                    String title = json_news.getString("title");
                    String date = json_news.getString("ctime");
                    String author_name = json_news.getString("description");
                    String url = json_news.getString("url");
                    Log.d(TAG, "url:*-*-*-*-*-*-*" + imgUrl);
                    News news = new News(bitmap, title, url, imgUrl, date, author_name);
                    newsList.add(news);
    
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            adapter.notifyDataSetChanged();
                        }
                    });

    ​​​​该页面同样实现了下拉&上滑刷新新闻的功能:

    下拉刷新:

    上滑加载: 

    该功能具体实现请参考——ListView实现上拉加载&下拉刷新

    删除新闻:

    在新闻列表点击每条新闻中的×号可完成新闻删除。

     

    @Override
        public void click(View view) {
            Toast.makeText(getContext(), "该新闻已删除!", Toast.LENGTH_SHORT).show();
            newsList.remove(Integer.parseInt(view.getTag().toString()));
            adapter.notifyDataSetChanged();
        }

    为每一个ListView item设置一个鼠标监听器,在remove方法中传入item的索引位置即可完成新闻列表的删除。

     新闻详情页面:(及加载提示)

     

    代码实现:

    show_news.getSettings().setJavaScriptEnabled(true);
            Intent intent = getIntent();
            final String news_url = intent.getStringExtra("url");
            final String news_title = intent.getStringExtra("title");
            final String news_date = intent.getStringExtra("date");
            final String news_author = intent.getStringExtra("author");
            final String news_picurl = intent.getStringExtra("pic_url");
            show_news.loadUrl(news_url);
    

     

    获得intent对象中由上一个页面传来的新闻URL,将WebView初始化后进行加载;完成页面详情的展示。

    mDialog = new ProgressDialog(ShowNewsActivity.this);
            mDialog.setMessage("玩命加载ing");
            show_news.setWebViewClient(new WebViewClient() {
                //网页加载时的回调
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    super.onPageStarted(view, url, favicon);
                    if (!mDialog.isShowing()) {
                        mDialog.show();
                    }
                }
    
                //网页停止加载时的回调
                @Override
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);
                    // 如果没有显示,则显示
                    if (mDialog.isShowing())
                        mDialog.dismiss();
                }
            });

    实例化ProgressDialog对象,设置标题与提示信息,以对用户进行友好提示。

    新闻收藏:

     

    代码实现:

    主要是利用SQLite存储整个收藏新闻信息;

    collect_news.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    collect_news.setImageResource(R.drawable.favorite_selected);
    
                    SQLiteDatabase db = helper.getWritableDatabase();
    
                    ContentValues values = new ContentValues();
                    //组装数据
                    values.put("news_url", news_url);
                    values.put("news_title", news_title);
                    values.put("news_date", news_date);
                    values.put("news_author", news_author);
                    values.put("news_picurl", news_picurl);
    
                    db.insert("Collection_News", null, values);
    
                    db.close();

    设置页面:

    清空缓存:

    因为在加载新闻列表时对新闻图片采取了三级缓存策略(网络,本地文件,内存),所以会产生一定的缓存,该功能会清理掉所有缓存;

    代码实现:

     // 获取文件
        //Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
        //Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
        public static long getFolderSize(File file) throws Exception {
            long size = 0;
            try {
                File[] fileList = file.listFiles();
                for (int i = 0; i < fileList.length; i++) {
                    // 如果下面还有文件
                    if (fileList[i].isDirectory()) {
                        size = size + getFolderSize(fileList[i]);
                    } else {
                        size = size + fileList[i].length();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return size;
        }
    
        /**
         * * 清除本应用内部缓存(/data/data/com.xxx.xxx/cache) * *
         *
         * @param context
         */
        public static void cleanInternalCache(Context context) {
            deleteFilesByDirectory(context.getCacheDir());
        }

    退出应用:

    用户点击后直接退出程序并返回桌面。

    代码实现:

    专门创建了一个用户维护所有活动(页面)的工具类,当用户点击退出按钮时实际调用exit方法,结束活动类表中每一个活动,并执行System.exit(0);退出。

    public class ApplicationUtil extends Application {
        private List<Activity> mList = new LinkedList<Activity>();
        private static ApplicationUtil instance;
    
        private ApplicationUtil() {
        }
    
        public synchronized static ApplicationUtil getInstance() {
            if (instance == null) {
                instance = new ApplicationUtil();
            }
            return instance;
        }
    
        // 添加Activity到列表中维持
        public void addActivity(Activity activity) {
            mList.add(activity);
        }
    
        public void exit() {
            try {
                for (Activity activity : mList) {
                    if (activity != null) {
                        activity.finish();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.exit(0);
            }
        }
    }

    我的:

    账号安全:

    该功能即修改用户基本信息;本质是对SQLite的应用;

    收藏夹:列举曾收藏过的所有新闻;

     

    ----------华丽分割线----------

     

    至此,项目介绍完毕。

     

    展开全文
  • android:text="我们的时间轴" android:textSize="25sp"/> <ImageView android:id="@+id/img_f2_shuaxin" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center...
  • App提交到App Store一般来说审核需要多长时间? 可以参考下这篇App Store上架审核机制文章,然后可以分析出审核过程需要花费多少时间,一般来说可以是一天左右或可能更久,在没有Bug等需要修改App的情况下会较快一些...
  • 如何做APP界面设计

    千次阅读 2018-02-15 14:28:44
    如何做APP界面设计转载 2013年05月17日 18:01:143213航班管家创意设计总监向怡宁近日在一线下活动中分享移动应用界面设计的话题,很实用,在此与大家分享。用户心态用户在面对移动应用时,心态有三大特征:第一是微...
  • 5+App和uni-appApp开发上有何区别?

    千次阅读 2020-11-12 10:32:05
    本文只谈仅做App的情况下,uni-appApp和5+App有什么区别。 5+App是DCloud上一代产品,基于webview扩展的混合开发技术。 它的每个页面都是一个webview加载一个html页面,调用原生扩展能力时通过webview的桥通信实现...
  • Fakeapp[AI换脸]迪丽热巴合成教程

    万次阅读 多人点赞 2019-06-12 17:54:21
    Fakeapp[AI换脸]迪丽热巴合成教程欢迎使用Markdown编辑器 欢迎使用Markdown编辑器 开始实验 1.第一步,生成数据集 先创建一个文件夹fake,将素材视频存放进去 咱们姑且用A和B来区分这两个小姐姐好了,按照FakeApp的...
  • 使用Monkey一次APP的压力测试

    千次阅读 2019-06-17 17:26:05
    主线程中了耗时操作,或响应时间过长 3.实践 1.准备测试环境 2.准备Android SDK环境 3.准备Python环境 安装环境视频+压测实践:https://www.imooc.com/video/13013 ANDROID_HOME="android-...
  • APP各个审核状态和时间

    千次阅读 2014-08-05 17:35:13
    更新App会遇到的各个状态和需要的时间 一次正常的更新会经历这样的过程:Prepare For Upload -> Waiting For Upload -> Upload Received -> Waiting For Review -> In Review -> Processing For App Store -> ...
  • B端app中台如何?

    2019-09-26 19:16:06
    “中台”这个概念我是在2017...我们的B端app也是在那时候改造的,在改造之前是这样的,电商业务线有自己独立的一个app,餐饮业务线、酒店业务线等等基本上每个业务线都要一个B端app.然而saas的B端app还是有很多共通性...
  • 最近看到的Slow App Startup Times里提到:The dynamic loader finds and reads the dependent dynamic libraries (dylibs) used by the App. Each library can itself have dependencies. The loading of Apple ...
  • 最简单的时间轴实现

    2017-05-24 16:45:54
    时间轴在一些小清新的app还是能带来不错的效果,我这里只是简单的实现了一下。由于代码没有什么封装,都是还是比较简单已读,适合初学者。 先看看效果图吧。 在使用时需要传入的数据,只需要传入item的时间,...
  • android新闻app

    千次阅读 多人点赞 2019-07-26 15:53:57
    制作一个基于聚合新闻数据简单的新闻APP制作简易新闻App 导航篇[1、使用Fragment+ViewPager +TabLayout自制简易新闻 app主要框架(一)](https://blog.csdn.net/Tobey_r1/article/details/93221486)[2、解析聚合新闻...
  • 点击查看上一篇文章:手把手教你如何搭建一个自己的安卓快速开发框架之带你自己的APP(三)继上一篇我们的开发,包含 BaseFragment 精美的仿微信底部菜单栏 网络请求失败时如何显示空View 那么,这一篇,我准备...
  • Android实现时间轴

    千次阅读 2017-12-12 18:06:26
    相信大家对于时间轴都不陌生,平时使用淘宝,京东查看物流的时候都会看到,我这里展示的是掌盟App上面的英雄时刻视频的页面(注意头部和顶部有空白部分) (注意结尾是一个结点没有延长线) 看到这个功能的时候...
  • 移动app的性能压测如何

    千次阅读 2019-04-26 10:52:30
    移动设备app的性能乍一看好像只是跟设备有关,感觉多花点银子,配置一个8G内存,256G存储的手机性能肯定不错。那一个app应用的性能真的只跟设备相关吗? 在测试一个对象时,首先应该了解他的整体架构,这样才能指定...
  • app专项测试

    千次阅读 2019-01-02 17:14:42
    这个我也了蛮久的了。在这里修改了一下本篇随笔。 首先我们了解一下什么是客户端的性能测试。性能测试相比大家都已经耳熟能详了,这个app的客户端性能测试估计还是有部分同学不甚了解。 客户端性能测试,主要就是...
  • 我在面试测试工程师时,经常问到的一个问题是“给出Word另存为这个功能的测试用例”。除开基本的测试用例外,...但是针对移动互联网App来说,情况还要复杂的多。 一个重要原则是:测试你最终要发布给用户的App版本。
  • 移动 App 开发 Native App-原生开发 开发技术 原生的 Android 平台 原生的 iOS 平台 JavaScript bridge 用于原生应用中的 Web 和原生平台进行交互。...原生应用中的 Web 怎么? Native APP 指的...
  • App版本迭代时间安排(思路重要)

    万次阅读 2016-05-08 23:39:29
    我创业时移动App时是一周一版,而现在是2周1版。 相比起小公司,大公司迭代时间虽长,却更为不易,因为大公司流程更多,参与人数更多,需求更多,实现这样的快速迭代存在许多挑战,也有一定风险,管理者控制...
  • [干货]手把手教你写一个安卓app

    万次阅读 多人点赞 2021-04-27 21:06:49
    这里我们介绍一种快速入门的方法来制作一款app,就算你是零基础小白没有学习过java语言,我相信看完我的文章半天时间你也会一个安卓app。本文针对初学者,大佬勿喷啊! 1. 创建HelloWorld项目 这里我就不介绍如何...
  • uni-app组件开发----多粒度时间选择器组件

    万次阅读 热门讨论 2019-03-20 16:25:30
    ###WXRUI体验二维码 ... 下载 DatePicker 多时间粒度选择器...可进行多时间粒度选择的时间选择器,组件名:rattenking-dtpicker,代码块: ruiDatePicker。 使用方式: 在 script 中引用组件 import ruiDatePicker f...
  • 露眼看App--怎样一款旅游类的App ?

    千次阅读 2014-02-14 17:17:50
    旅游App主要特点,也可以说是主要功能就是旅游攻略,游记这两个功能,有些App会有行程单功能。 那攻略,游记,行程单之间有什么样的区别呢?说一下我的看法,攻略一般指某个城市有什么好玩的景点啊,美餐,住宿,交通,贴士等等...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 142,252
精华内容 56,900
关键字:

做时间线的app