我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android开发-使用Realm数据库实现App中的收藏功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android开发-使用Realm数据库实现App中的收藏功能

前 言

App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式:

使用SharedPreferences存储数据; 文件存储数据; SQLite数据库存储数据; 使用ContentProvider存储数据; 网络存储数据。

其中前四种都是缓存数据到本地,这篇主要讲的是使用第三种方式来实现App中的收藏功能,不过不用Android原生自带SQLite数据库来存储数据,而是使用第三方的Realm数据库来来存储数据。

Realm 本质上是一个嵌入式数据库,他并不是基于SQLite所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。和SQLite不同的是,它允许你在持久层直接和数据对象工作。在它之上是一个函数式风格的查询api,众多的努力让它比传统的SQLite 操作更快 。

Realm不仅支持Android的接入,还支持IOS的接入。那么接下来就使用Realm数据库实现Android App中的收藏功能吧。

需求分析

要使用Realm数据库实现App中的收藏功能,需要实现以下几个功能和步骤:

在Android项目接入Realm数据库; 创建收藏数据库表; 实现对收藏数据库表进行增删查的操作; 数据库表增删查时界面实时渲染和更新。 接入Realm数据库

然后在AS的外层build.gradle里的buildscript.dependencies添加Realm数据库相关的依赖

buildscript {  
    dependencies {
        ...
        classpath "io.realm:realm-gradle-plugin:6.0.1"
    }
}

然后在AS的内层build.gradle里添加Realm数据库相关的依赖

在顶部 apply plugin: ‘com.android.application’ 下添加 apply plugin: ‘realm-android’ 的声明,如下图
在这里插入图片描述
在定义的Application里初始化数据库相关的配置(包括数据库名称和版本号,具体代码看Demo源码)

    
    private void initRealm(Context context) {
        try {
            Realm.init(context);
            RealmConfiguration config = new RealmConfiguration.Builder()
                    .name(RealmConstant.REALM_DB_NAME)
                    .schemaVersion(RealmConstant.REALM_DB_VERSION)
                    .build();
            Realm.setDefaultConfiguration(config);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
创建收藏数据库表

首先先创建一张收藏数据库表,代码如下:


public class MovieCollectDBModel extends RealmObject {
    // 影视id,主键
    @Required
    @PrimaryKey
    @Index
    private String movieId;
    // 影视名称
    @Required
    private String movieName;
    // 影视海报、封面
    @Required
    private String poster;
    // 影视标签
    @Required
    private String movieLabel;
    // 影视类型
    @Required
    private String videoType;
    // 添加到数据的时间
    @Required
    private String createdTime;
    // 以下省略字段的 set 和 get
}

该类继承于Realm的RealmObject类,其中字段movieId作为该表的主键,也是数据在表里的唯一性。

收藏数据库表的增删查

添加影视数据到到数据库的操作(增)

    
    public void addCollectToDB(String mvId, String mvName, String movieImg, String movieLabel, String videoType) {
        MovieCollectDBModel movieCollectDBModel = new MovieCollectDBModel();
        movieCollectDBModel.setMovieId(mvId);
        movieCollectDBModel.setMovieName(mvName);
        movieCollectDBModel.setPoster(movieImg);
        movieCollectDBModel.setMovieLabel(movieLabel);
        movieCollectDBModel.setVideoType(videoType);
        movieCollectDBModel.setCreatedTime(BaseUtil.getNowDateTimeFormat());
        mTransaction = mRealm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.copyToRealmOrUpdate(movieCollectDBModel);
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                L.i("收藏数据添加成功!");
                ToastUtil.showToast(String.format("%s 已收藏", mvName));
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                L.i("收藏数据添加失败:" + error.toString());
                ToastUtil.showToast(String.format("%s 收藏失败", mvName));
            }
        });
    }

上面的代码是Realm数据插入数据到数据库的操作,这是一样异步插入数据的方式。在业务场景的需要,可以改新增和更新数据的插入方式,比如插入数据时如果数据库中已经存在了该数据则进行更新操作,否则进行了新增操作。

从数据库中删除一条影视数据的操作(删)

    
    public void deleteByKeyCollectData(String key, String value) {
        RealmResults movieCollectDBModels = mRealm.where(MovieCollectDBModel.class)
                .equalTo(key, value)
                .findAllAsync();
        movieCollectDBModels.addChangeListener(new RealmChangeListener<RealmResults>() {
            @Override
            public void onChange(RealmResults movieCollectDBModels1) {
                if (movieCollectDBModels1.isEmpty()) return;
                mRealm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        movieCollectDBModels1.deleteFromRealm(0);
                    }
                });
            }
        });
    }

从数据库中删除全部影视数据的操作(删)

    
    public void deleteAllCollectData() {
        RealmResults movieCollectDBModels = mRealm.where(MovieCollectDBModel.class)
                .findAll();
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                if (movieCollectDBModels.isEmpty()) {
                    ToastUtil.showToast("暂无收藏数据可删除");
                    return;
                }
                movieCollectDBModels.deleteAllFromRealm();
                ToastUtil.showToast("收藏数据已全部清空");
            }
        });
    }

从数据库中查询全部影视数据的操作(查)

    
    public void queryAllCollectData(RealmChangeListener<RealmResults> listener) {
        RealmResults movieCollectDBModels = mRealm.where(MovieCollectDBModel.class)
                .sort("createdTime", Sort.DESCENDING)
                .findAllAsync();
        movieCollectDBModels.addChangeListener(listener);
    }

当前用户进入收藏界面的时候,需要从数据库中拉取全部的收藏数据,可以刚才添加收藏时间进行倒序排序。

数据库表增删查时界面的渲染和更新

当用户进入主页的时候,首次从网络获取数据,然后遍历一下网络获取数据是否已经有数据操作收藏数据库中,如果有的话则需要提示用户该数据已经被收藏并更改收藏图标。

public class MainActivity extends AppCompatActivity {
    private MovieAdapter adapter;
    private List mList = new ArrayList();
    private RealmDBHelp mRealmDBHelp;
    private boolean refreshType;
    @BindView(R.id.mTitleBar)
    TitleBar mTitleBar;
    @BindView(R.id.homeMovieList)
    RecyclerView homeMovieList;
    @BindView(R.id.refreshLayout)
    RefreshLayout refreshLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initRefresh();
    }
    private void initView() {
        ButterKnife.bind(this);
        mTitleBar.setOnTitleBarListener(new OnTitleBarListener() {
            @Override
            public void onLeftClick(View v) {
            }
            @Override
            public void onTitleClick(View v) {
            }
            @Override
            public void onRightClick(View v) {
                // 跳转至我的收藏界面
                startActivity(new Intent(MainActivity.this, MovieCollectActivity.class));
            }
        });
        // 初始化本地数据库帮助类
        mRealmDBHelp = new RealmDBHelp();
    }
    private void initRefresh() {
        // 开启自动加载功能(非必须)
        refreshLayout.setEnableAutoLoadMore(true);
        refreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(@NonNull final RefreshLayout refreshLayout) {
                refreshLayout.getLayout().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        refreshType = true;
                        // 加载数据
                        initData();
                        refreshLayout.finishRefresh();
                        refreshLayout.resetNoMoreData();//setNoMoreData(false);
                    }
                }, 2000);
            }
        });
        refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore(@NonNull final RefreshLayout refreshLayout) {
                refreshLayout.getLayout().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        refreshType = false;
                        ToastUtil.showToast("暂无更多的数据啦");
                        // 将不会再次触发加载更多事件
                        refreshLayout.finishLoadMoreWithNoMoreData();
                        refreshLayout.setEnableLoadMore(false);
                        refreshLayout.finishLoadMore();
                    }
                }, 2000);
            }
        });
        //触发自动刷新
        refreshLayout.autoRefresh();
    }
    private void initData() {
        // 模拟从网络获取到json数据  app\class="lazy" data-src\main\assets\movieData.json
        String jsonData = BaseUtil.getAssetsJson(this, "movieData.json");
//        L.i("jsonData:" + jsonData);
        if (TextUtils.isEmpty(jsonData)) {
            ToastUtil.showToast("Json数据为空");
            return;
        }
        if (mList != null) mList.clear();
        // 将json数据解析为Java实体对象
        MovieDataModel movieDataModel = new Gson().fromJson(jsonData, MovieDataModel.class);
        List dataBeanList = movieDataModel.getData();
        for (MovieDataModel.DataBean dataBean : dataBeanList) {
            MovieDataModel.DataBean data = new MovieDataModel.DataBean();
            data.setMvid(dataBean.getMvid());
            data.setName(dataBean.getName());
            data.setPoster(dataBean.getPoster());
            data.setUpdateStatus(dataBean.getUpdateStatus());
            data.setTag(dataBean.getTag());
            data.setVideo_type(dataBean.getVideo_type());
            mList.add(data);
        }
        // 查询本地收藏数据库中是否存在收藏的数据(更改收藏图标用的)
        queryAllCollectData();
        try {
            // 设置适配器
            homeMovieList.setLayoutManager(new GridLayoutManager(this, 3));
            adapter = new MovieAdapter(this, mList);
            homeMovieList.setAdapter(adapter);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 设置条目的点击事件
        adapter.setItemClikListener(new MovieAdapter.OnItemClikListener() {
            @Override
            public void onItemClik(View view, int position) {
                String mvId = mList.get(position).getMvid();
                String mvName = mList.get(position).getName();
                String movieImg = mList.get(position).getPoster();
                String movieTag = mList.get(position).getTag();
                String videoType = mList.get(position).getVideo_type();
                boolean isCollect = mList.get(position).isCollect();
                if (isCollect) {
                    // 如果已经收藏了则清除该条收藏
                    // 根据Id来删除一条数据
                    mRealmDBHelp.deleteByKeyCollectData("movieId", mvId);
                    mList.get(position).setCollect(false);
                    ToastUtil.showToast(String.format("%s 已取消收藏", mvName));
                } else {
                    // 添加收藏数据到本地数据库
                    mRealmDBHelp.addCollectToDB(mvId, mvName, movieImg, movieTag, videoType);
                    mList.get(position).setCollect(true);
                }
                // 通知适配器数据改变重新更新界面
                adapter.notifyDataSetChanged();
            }
            @Override
            public void onItemLongClik(View view, int position) {
            }
        });
    }
    
    private void queryAllCollectData() {
        mRealmDBHelp.queryAllCollectData(new RealmChangeListener<RealmResults>() {
            @Override
            public void onChange(RealmResults movieCollectDBModels) {
                if (movieCollectDBModels.isEmpty()) {
                    return;
                }
                for (MovieCollectDBModel movieCollectDBModel : movieCollectDBModels) {
                    for (int i = 0; i < mList.size(); i++) {
                        if (mList.get(i).getMvid().equals(movieCollectDBModel.getMovieId())) {
                            mList.get(i).setCollect(true);
                            break;
                        }
                    }
                }
            }
        });
    }
    @Override
    protected void onStop() {
        super.onStop();
        mRealmDBHelp.closeTransaction();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mRealmDBHelp.close();
    }
}

收藏界面的代码,包括查询和删除操作。

public class MovieCollectActivity extends AppCompatActivity {
    private RealmDBHelp mRealmDBHelp;
    private List mList = new ArrayList();
    private MovieCollectAdapter adapter;
    private boolean refreshType;
    @BindView(R.id.mTitleBar)
    TitleBar mTitleBar;
    @BindView(R.id.movieCollectList)
    RecyclerView movieCollectList;
    @BindView(R.id.empty_view)
    RelativeLayout empty_view;
    @BindView(R.id.refreshLayout)
    RefreshLayout refreshLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movie_collect);
        initView();
        initRefresh();
    }
    private void initView() {
        ButterKnife.bind(this);
        mTitleBar.setOnTitleBarListener(new OnTitleBarListener() {
            @Override
            public void onLeftClick(View v) {
                finish();
            }
            @Override
            public void onTitleClick(View v) {
            }
            @Override
            public void onRightClick(View v) {
                deleteRealmDB();
            }
        });
        mRealmDBHelp = new RealmDBHelp();
    }
    private void initRefresh() {
        // 开启自动加载功能(非必须)
        refreshLayout.setEnableAutoLoadMore(true);
        refreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(@NonNull final RefreshLayout refreshLayout) {
                refreshLayout.getLayout().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        refreshType = true;
                        // 加载数据
                        initData();
                        refreshLayout.finishRefresh();
                        refreshLayout.resetNoMoreData();//setNoMoreData(false);
                    }
                }, 2000);
            }
        });
        refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore(@NonNull final RefreshLayout refreshLayout) {
                refreshLayout.getLayout().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        refreshType = false;
                        ToastUtil.showToast("暂无更多的数据啦");
                        // 将不会再次触发加载更多事件
                        refreshLayout.finishLoadMoreWithNoMoreData();
                        refreshLayout.setEnableLoadMore(false);
                        refreshLayout.finishLoadMore();
                    }
                }, 2000);
            }
        });
        //触发自动刷新
        refreshLayout.autoRefresh();
    }
    private void initData() {
        queryAllCollectData();
    }
    
    private void queryAllCollectData() {
        mRealmDBHelp.queryAllCollectData(new RealmChangeListener<RealmResults>() {
            @Override
            public void onChange(RealmResults movieCollectDBModels) {
                if (movieCollectDBModels.isEmpty()) {
                    return;
                }
                if (mList != null) mList.clear();
                for (MovieCollectDBModel movieCollectDBModel : movieCollectDBModels) {
                    MovieCollectModel data = new MovieCollectModel();
                    data.setMovieId(movieCollectDBModel.getMovieId());
                    data.setMovieName(movieCollectDBModel.getMovieName());
                    data.setPoster(movieCollectDBModel.getPoster());
                    data.setMovieTag(movieCollectDBModel.getMovieLabel());
                    data.setVideoType(movieCollectDBModel.getVideoType());
                    data.setCreatedTime(movieCollectDBModel.getCreatedTime());
                    mList.add(data);
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        parsingMovieList();
                    }
                });
            }
        });
    }
    private void parsingMovieList() {
        movieCollectList.setLayoutManager(new GridLayoutManager(this, 3));
        adapter = new MovieCollectAdapter(this, mList);
        movieCollectList.setAdapter(adapter);
        if (mList.isEmpty()) {
            empty_view.setVisibility(View.VISIBLE);
            movieCollectList.setVisibility(View.GONE);
        } else {
            movieCollectList.setVisibility(View.VISIBLE);
            empty_view.setVisibility(View.GONE);
        }
        adapter.setItemClikListener(new MovieCollectAdapter.OnItemClikListener() {
            @Override
            public void onItemClik(View view, int position) {
                // 根据Id来删除一条数据
                deleteByKeyCollectData(position);
            }
            @Override
            public void onItemLongClik(View view, int position) {
            }
        });
    }
    
    private void deleteByKeyCollectData(int position) {
        IOSMsgDialog.Companion.init(getSupportFragmentManager())
                .setTitle("清除影视提示")
                .setMessage("是否要清除该条影视收藏的数据?")
                .setAnimStyle(R.style.LDialogScaleAnimation)
                .setNegativeButton("否", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                    }
                })
                .setPositiveButton("是", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 根据Id来删除一条数据
                        mRealmDBHelp.deleteByKeyCollectData("movieId", mList.get(position).getMovieId());
                        mList.remove(position);
                        adapter.notifyDataSetChanged();
                    }
                }, Color.RED)
                .setDismissListener(new OnDialogDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                    }
                }).setCancelableOutside(true).show();
    }
    
    private void deleteRealmDB() {
        IOSMsgDialog.Companion.init(getSupportFragmentManager())
                .setTitle("清空全部收藏数据提示")
                .setMessage("是否要立即清空全部我的收藏的数据?如果要清除单条数据的话请点击单条数据列表。")
                .setAnimStyle(R.style.LDialogScaleAnimation)
                .setNegativeButton("否", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                    }
                })
                .setPositiveButton("是", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 清除全部收藏的数据库内容
                        mRealmDBHelp.deleteAllCollectData();
                        mList.clear();
                        empty_view.setVisibility(View.VISIBLE);
                        movieCollectList.setVisibility(View.GONE);
                        adapter.notifyDataSetChanged();
                    }
                }, Color.RED)
                .setDismissListener(new OnDialogDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                    }
                }).setCancelableOutside(true).show();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mRealmDBHelp.close();
    }
}

界面运行效果图如下:
在这里插入图片描述

apk安装包下载体验地址:

可以扫描以下二维码进行下载安装,或者点击以下链接 http://app.fukaimei.top/MovieCollect 进行下载安装体验。
在这里插入图片描述

———————— The end ————————

码字不易,如果您觉得这篇博客写的比较好的话,可以赞赏一杯咖啡吧~~
在这里插入图片描述

Demo程序源码下载地址一(GitHub)
Demo程序源码下载地址二(码云)


作者:_彼岸雨敲窗_


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android开发-使用Realm数据库实现App中的收藏功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android开发-使用Realm数据库实现App中的收藏功能

前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据; 文件存储数据; SQLite数据库存储数据; 使用ContentPr
2022-06-06

Android使用Realm数据库实现App中的收藏功能(代码详解)

前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式:使用SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据;使用ContentProvider
2022-06-06

Android开发中使用sqlite实现新闻收藏和取消收藏的功能

之前学习oracle,简单的认为数据库只存在服务器端,学习安卓之后才发现原来android和Ios本身是“携带”数据库的——SQLite,是轻量级的、嵌入式的、关系型数据库,是Android、IOS等广泛使用的的数据库系统。用于存储本地的
2022-06-06

Android开发中如何使用PopupWindow实现隐藏与显示功能

这篇文章给大家介绍Android开发中如何使用PopupWindow实现隐藏与显示功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、PopupWindow的隐藏final PopupWindow window =
2023-05-31

Android App开发中使用RecyclerView实现Gallery画廊的实例

什么是RecyclerView RecyclerView是Android 5.0 materials design中的组件之一,相应的还有CardView、Palette等。看名字我们就能看出一点端倪,没错,它主要的特点就是
2022-06-06

Android App中使用RatingBar实现星级打分功能的教程

RatingBar简单介绍 RatingBar是基于SeekBar(拖动条)和ProgressBar(状态条)的扩展,用星形来显示等级评定,在使用默认RatingBar时,用户可以通过触摸/拖动/按键(比如遥控器)来设置评分, Rating
2022-06-06

android开发中使用Handler怎么实现预加载功能

这篇文章将为大家详细讲解有关android开发中使用Handler怎么实现预加载功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在进行Android客户端界面开发时,我们常常会需要将从服务
2023-05-31

使用阿里云数据库实现短信发送功能

本文将介绍如何使用阿里云数据库来实现短信发送功能。阿里云数据库是一个强大而易用的云数据库服务,可以提供稳定、安全的数据存储和访问。我们将使用阿里云数据库的API来实现短信发送功能。首先,我们需要在阿里云上创建一个数据库实例。在阿里云控制台中,找到“数据库”服务,点击“创建实例”,选择合适的实例规格,然后填写实例名
使用阿里云数据库实现短信发送功能
2023-11-10

在Android开发中通过使用View实现进度条功能

在Android开发中通过使用View实现进度条功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.ProgressBarView1(支持拖动):2.ProgressBarV
2023-05-31

如何使用MongoDB实现数据的图数据库功能

如何使用MongoDB实现数据的图数据库功能近年来,随着数据量的不断增长和复杂关系的日益重要,图数据库的应用变得越来越广泛。传统关系型数据库面对复杂的图状数据结构和大量的关系查询时,性能受限,而图数据库则能更好地解决这些问题。本文将介绍如何
2023-10-22

Android开发中使用ListView 与 CheckBox实现一个多选框功能

Android开发中使用ListView 与 CheckBox实现一个多选框功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。效果:1 单选public class Sin
2023-05-31

在Android开发中使用 listview ExpandableListView实现多选或单选功能

在Android开发中使用 listview ExpandableListView实现多选或单选功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。listvie
2023-05-31

android开发中使用dialog实现一个加载提示框示功能

android开发中使用dialog实现一个加载提示框示功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。效果图!首先就是新建一个dialog的XML文件了
2023-05-31

android开发中使用view实现自定义一个进度条功能

今天就跟大家聊聊有关android开发中使用view实现自定义一个进度条功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、自定义属性:
2023-05-31

如何自Android开发中使用ClipboardManager实现一个剪贴板功能

这篇文章给大家介绍如何自Android开发中使用ClipboardManager实现一个剪贴板功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在开发一些系统应用的时候,我们可以需要用到Android的剪贴板功能,比如
2023-05-31

Android开发中使用View实现一个垂直上拉下滑功能

Android开发中使用View实现一个垂直上拉下滑功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。效果二、实现思路 1、这个效果其实有很多实现方法,为了让松
2023-05-31

Android数据库(SQLite)的简单使用——增、删、查改功能的简单实现

记录一下Android数据库的增删查改的简单使用 话不多说,先献上你们最爱的效果图~ 这边我用的是一个ListView来展示数据库里的数据准备工作: 先写一个类继承SQLiteOpenHelper,因为SQLiteOpenHelper.ja
2022-06-06

Android开发中如何使用touch实现移动端的下拉刷新功能

今天就跟大家聊聊有关Android开发中如何使用touch实现移动端的下拉刷新功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。第一部分:四个touch事件  1.touchstar
2023-05-31

Android开发中使用RatingBar UI控件实现一个星星评分功能

这期内容当中小编将会给大家带来有关Android开发中使用RatingBar UI控件实现一个星星评分功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体内容如下继承关系AppCompatRatingB
2023-05-31

Android开发中使用PHP服务器怎么实现一个登录功能

Android开发中使用PHP服务器怎么实现一个登录功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Android客户端和PHP、MySQL搭建的服务器之间的简单交互,实
2023-05-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录