tag 标签: Android

相关帖子
相关博文
  • 2021-9-14 15:25
    208 次阅读|
    0 个评论
    Android之读取通话记录实例
    在 Android 中提供了很多系统 ContextProvider ,通话记录就是其中的一个典型代表。下面我们以读取通话记录为例,展示如何读取系统自带的 ContextProvider 以及动态权限的处理和操作自定义的 ContexProvider 一样,操作系统的 ContextProvider 也是使用 ContentResolver 类。本实例中主要是读取通话记录,因此只需调用 query ()方法,传入 URI 即可。 为了实现读取通话记录的功能,在 Activiy 对应的布局文件 activity_ main. xml 中添加了一个 ListView ,代码如下 ∶
  • 2021-9-2 15:01
    289 次阅读|
    0 个评论
    Android之自定义 ContentProvider
    在学习了 ContentProvider 的几个常用类和如何创建一个内容提供者的方法之后,下面我们用一个实例来进一步加深理解。通过一个完整的实例来展示如何 用 ContentProvider 类 进行数据库操作。将通过创建 100 条模拟数据,用 ListView 展示出来 。 在进行具体的数据库操作之前,先建立一个 Java 实体类 User 类,再通过这个实体类进行数据的封装。 User 类中包括 userId 、 name 、 age 三个属性,具体代码如下 ∶ package com.rfstar.sqlitetest2; public class User { private int userId; private String name; private int age; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId=userId; } public String getName() { return name; } public void setName(String name) { this.name=name; } public int getAge() { return age; } public void setAge(int age) { this.age=age; } } 完成 Java 实体类的创建之后,通过继承 SQ Li te O p e n Helper 来 实现数据 库辅 助类, 并 实现 其中 的 onCeate () 方 法和 onUpgrate() 方法 。 在 onCreate() 方法中 创建 表并 使 表 中 的 字 段与 U ser 类的 属性相一致。同时实现 onUpgrate() 方法,以更新数据库。 package com.rfstar.sqlitetest2; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class OpenHelper extends SQLiteOpenHelper { private static final String name="test.db"; private static final int version=1; public OpenHelper(Context context) { super(context,name,null,version); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS "+ "user (person_id INTEGER PRIMARY KEY AUTOINCREMENT,"+ "name varchar(32),age INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { oldVersion) { sqLiteDatabase.execSQL("ALTER TABLE user ADD phone VARCHAR(11)"); } } } 接下来创建 UserDao 类,并在该类中实现对 User 的增、删、改、查操作,代码如下: package com.rfstar.sqlitetest2; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.List; public class UserDao { private SQLiteDatabase database; public UserDao(SQLiteDatabase sqLiteDatabase) { this.database = sqLiteDatabase; } public boolean insert(User user) { ContentValues contentValues = new ContentValues(); contentValues.put("name", user.getName()); contentValues.put("age", user.getAge()); long insertResult = database.insert("user", null, contentValues); if (insertResult == -1) { return false; } return true; } public boolean delete(User user) { int deleteResult = database.delete("user", "user_id+?", new String {user.getUserId()+""}); if(updateResult==0) { return false; } return true; } public User queryOne(User user) { Cursor cursor=database.query("user",null,"name=?",new String 当完成上述 3个类之后,接下来就可以使用Activity进行各项操作了(1)创建数据 创建一个 MainActivity,并在MainActivity中创建一个循环生成100条数据的方法,代码如下: package com.rfstar.sqlitetest2; import androidx.appcompat.app.AppCompatActivity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.widget.ListView; import android.widget.SimpleAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends AppCompatActivity { private OpenHelper openHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); openHelper=new OpenHelper(this); initData(); } private void initData() { SQLiteDatabase sqLiteDatabase=openHelper.getReadableDatabase(); UserDao userDao=new UserDao(sqLiteDatabase); sqLiteDatabase.beginTransaction(); try { User user=new User(); for(int i=0;i<100;i++) { user.setName("大鸟科创空间"+i); user.setAge(6); userDao.insert(user); } sqLiteDatabase.setTransactionSuccessful(); }catch (Exception e) { Log.e("user Transaction",e.toString()); }finally { sqLiteDatabase.endTransaction(); sqLiteDatabase.close(); } } } 我们在这个应用中增加一个 ContentProvider,再创建一个新的应用,在应用中去操作这个ContentProvider的数据。 首先创建 UserProvider类,并让UserProvider类继承ContentProvider类,并实现onCreate()等方法。这些方法主要是对数据库进行操作,代码如下: package com.rfstar.sqlitetest; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import java.util.regex.Matcher; public class UserProvider extends ContentProvider { private OpenHelper openHelper; //若不匹配采用UriMatcher.NO_MATCH(-1)返回 private static final UriMatcher MATCHER=new UriMatcher(UriMatcher.NO_MATCH); //匹配码 private static final int USER=1; private static final int USER_ID=2; static { //匹配返回USER,不匹配返回-1 MATCHER.addURI("com.rfstar.sqlitetest.userProvider","user",USER); //匹配返回USER_ID,不匹配返回-1 MATCHER.addURI("com.rfstar.sqlitetest.userProvider","user/#",USER_ID); } @Override public boolean onCreate() { openHelper=new OpenHelper(this.getContext()); return true; } /** * 外部应用向本应用插入数据 */ @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db=openHelper.getWritableDatabase(); switch (MATCHER.match(uri)) { case USER: long id=db.insert("user","name",values); Uri insertUri= ContentUris.withAppendedId(uri,id); return insertUri; default: throw new IllegalArgumentException("this is unknown uri:"+uri); } } /** * 外部应用向本应用删除数据 */ @Override public int delete(Uri uri,String selection,String selectionArgs) { SQLiteDatabase db=openHelper.getWritableDatabase(); switch (MATCHER.match(uri)) { case USER: return db.update("user",values,selection,selectionArgs);//更新所有记录 case USER_ID: long id=ContentUris.parseId(uri);//取得跟在Uri后面的数字 String where="user_id="+id; if(null!=selection&&!"".equals(selection.trim())) { where+="and"+selection; } return db.update("user",values,where,selectionArgs); default: throw new IllegalArgumentException("this is unknown uri:"+uri); } } /** * 如果是单条记录,应该返回以vnd.android.cursor.item/为首的字符串 * 如果是多条记录,应该返回以vnd.android.cursor.dir/为首的字符串 */ @Override public String getType(Uri uri) { switch(MATCHER.match(uri)) { case USER: return "vnd.android.cursor.dir/user"; case USER_ID: return "vnd.android.cursor.item/user"; default: throw new IllegalArgumentException("this is unknown uri:"+uri); } } @Override public Cursor query(Uri uri,String selectionArgs,String sortOrder) { SQLiteDatabase db=openHelper.getReadableDatabase(); switch (MATCHER.match(uri)) { case USER: return db.query("user",projection,selection,selectionArgs,null,null,sortOrder); case USER_ID: long id=ContentUris.parseId(uri); String where="user_id="+id; if(null!=selection&&!"".equals(selection.trim())) { where+="and"+selection; } return db.query("user",projection,where,selectionArgs,null,null,sortOrder); default: throw new IllegalArgumentException("this is unknown uri:"+uri); } } } 代码编写完成后,需要在 AndroidManifest.xml文件中进行配置。在Application节点下面增加一条配置:
  • 热度 6
    2021-6-17 11:39
    817 次阅读|
    0 个评论
    android之ViewPager与TabLayout
    使用 TabLayout 很容易实现选项卡的功能。这里将结合 ViewPager 、 Fragment 、 TabLayout 实现一个具有选项卡功能的程序。 本例再上篇讲解的 ViewPager 与 Fragment 实例上修改,请结合上篇实例参考。 要实现这样一个程序,首先需要在布局文件中加入 TabLayout 。 MainActivity 中对应的布局文件代码如下:
  • 热度 9
    2021-6-16 14:15
    796 次阅读|
    0 个评论
    android中ViewPager 与 Fragment
    在实际的开发过程中, ViewPager 与 Fragment 组合使用是比较常见的,而对于 fragment ,它所使用的适配器是 FragmentPagerAdapter 。 FragmentPagerAdapter 继承自 PagerAdapter 类,用于呈现 Fragment 页面。这些 Fragment 页面会一直保存在 FragmentManager 中,以便用户随时取用。 这个适配器最好用于有限个静态 fagment 页面的管理。尽管不可见的视图有时会被销毁 , 但用户所有访问过的 fr a gmemt 都会被保存在内存中。因此 fragment 实例会保存大量的各种状态,这就造成了很大的内存开销。如果要处理大量的页面切换,就可以使用 FragmentSt a teP a ger - Adaper 。 每一个使用 FragmentPagerAdapter 的 ViewPager 都要有一个有效的 ID 集合,有效 ID 的集合就是 Fragment 的集合。对于 FragmentPagerAdapter 的子类,只需要重写 getltem ( int position )和 getCount () 就可以了。 创建一个继承 FragmentPagerAdapter 类的类,代码如下 ∶ package com.rfstar.viewpagertest02; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import java.util.List; public class FragmentAdapter extends FragmentPagerAdapter { private List fragmentList; public FragmentAdapter(FragmentManager fm,List fragments) { super(fm); this.fragmentList=fragments; } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } } 重写的两个方法的作用很 明显 : g e t It em ( i nt postion )是根据位置获取 Fragment , geCount () 是用来获取列表数量的。 下面创建 3 个 Fragment 类,代码如下 ∶ package com.rfstar.viewpagertest02; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; public class FirstFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState){ return inflater.inflate(R.layout.fragment_first,container,false); } } 其他两个Frgment 类与之没有区别,对应的布局文件只添加了一个文本框,展示一行文字。fragment_first.xml布局文件代码如下:
  • 热度 6
    2021-6-11 13:15
    700 次阅读|
    0 个评论
    android之ViewPager的使用
    ViewPager 是一个非常强大的 UI 组件,应用非常广泛。它提供了多界面切换的效果,具体来说就是 ∶ 当前显示一组界面中的一个界面,当用户左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分,滑动结束后,界面自动跳转到当前选择的界面中。 下面用实例来说明如何使用。 和之前的其他控件一样,使用 ViewPager 也需要把 ViewPager 对应的控件加入布局文件中。在 MainActivity 对应的 布局文件中添加 ViewPager 的代码如下 ∶
相关资源
广告