通过前面一篇,“我的”页面的后台就搭建完整了,接下来就继续处理一下Android端下“我的”页面剩余还未完成的功能——修改密码、查看我的分享、查看我的日记、查看我的收藏、查看iShare相关

1.修改密码的页面设计——activity_change_password.xml

  • 页面包括旧密码输入框、新密码输入框,具体代码如下:
<?xml version="1.0" encoding="utf-8"?>                                                                                                            

2.修改密码页面的逻辑

  • 在之前创建好的com.example.discover包中创建class命名为ChangePassword.java
  • 在AndroidManifest.xml中添加配置:
  • ChangePassword.java文件处理的逻辑就是获取到用户的昵称、用户输入的旧密码、用户输入的新密码,然后请求已经创建好的servlet——ChangePassword,然后得到是否修改成功的返回信息,ChangePassword.java文件具体代码如下
package com.example.discover;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class ChangePassword extends Activity {    EditText old_pass_et;   //旧密码    EditText new_pass_et;   //新密码    Button sure_change_pass;   //确定修改    String baseUrl = "http://10.0.2.2:8080/iShareService/servlet/";   //web服务器的地址    String imgBaseUrl = "http://10.0.2.2:8080/iShareService/images/";  //图片资源    String userName,oldPass,newPass;   //存放用户基本信息    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_change_password);        old_pass_et = (EditText) findViewById(R.id.et_old_login_password); //新密码        new_pass_et = (EditText) findViewById(R.id.et_new_login_password); //新密码        sure_change_pass = (Button)findViewById(R.id.bt_change_password) ;//确定修改密码的按钮        setBaseInfo();        sure_change_pass.setOnClickListener(new ChangePassword.onClick());    }    class onClick implements View.OnClickListener {        @Override        public void onClick(View v) {            oldPass = old_pass_et.getText().toString();            newPass = new_pass_et.getText().toString();            StringBuilder stringBuilder = new StringBuilder();            BufferedReader buffer = null;            HttpURLConnection connGET = null;            if(oldPass.length()==0||newPass.length()==0){                Toast.makeText(ChangePassword.this, "密码不能为空", Toast.LENGTH_LONG).show();                return;            }            try {                String registerUrl = baseUrl+"ChangePassword?oldPass="+oldPass+"&newPass="+newPass+"&username="+userName;                URL url = new URL(registerUrl);                connGET = (HttpURLConnection) url.openConnection();                connGET.setConnectTimeout(5000);                connGET.setRequestMethod("GET");                if (connGET.getResponseCode() == 200) {                    buffer = new BufferedReader(new InputStreamReader(connGET.getInputStream()));                    for (String s = buffer.readLine(); s != null; s = buffer.readLine()) {                        stringBuilder.append(s);                    }                    Toast.makeText(ChangePassword.this, stringBuilder.toString(), Toast.LENGTH_LONG).show();                    //通过handler设置延时1秒后执行r任务,跳转到我的页面                    new Handler().postDelayed(new ChangePassword.LoadMainTask(),500);                    buffer.close();                }else{                    Toast.makeText(ChangePassword.this,"非200.."+connGET.getResponseCode() , Toast.LENGTH_LONG).show();                }            } catch (Exception e) {                e.printStackTrace();                Toast.makeText(ChangePassword.this, "get 提交 err.." + e.toString(), Toast.LENGTH_LONG).show();            }        }    }    //启动线程,加载我的页面    private class LoadMainTask implements Runnable{        @Override        public void run() {            Intent intent = new Intent(ChangePassword.this,MyTabFragment.class);            /*startActivity(intent);*/            setResult(2, intent); //这里的2就对应到onActivityResult()方法中的resultCode            finish();        }    }    //获取用户信息    public void setBaseInfo(){        //获取最新的登录状态,SharePreferences为永久存储,需要手动退出        SharedPreferences sp = ChangePassword.this.getSharedPreferences("save", Context.MODE_PRIVATE);        userName = sp.getString("name","");    }}

 

3.我的分享、我的日记、我的收藏 页面设计

  • 这三个功能按钮都是跳转到的页面其实是同一个,只不过内容获取是不一样的,所以在这里只需要写一个详情页就可以了
  • 在layout下新建activity_about_me.xml文件,在该布局下就只需要要一个ListView就可以了,详细代码如下:
<?xml version="1.0" encoding="utf-8"?>                

4.我的分享、我的日记、我的收藏 页面的逻辑

  • 在已经创建好的com.example.discover包中创建class——MyShareList.java
  • 因为是跳转页面,所以在AndroidMainifest.xml中要添加配置
  • 该文件处理的主要部分就是,获取到上一个页面传递的type(用于判断请求的是我的分享、我的日记还是我的收藏),然后获取到该用户的昵称,通过这两个参数请求后台的servlet——QueryAboutMe.java,返回相对应类型的内容,MyShareList.java具体代码如下:
package com.example.discover;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Handler;import android.os.StrictMode;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.example.bean.FindInfo;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ScheduledExecutorService;public class MyShareList extends Activity implements AbsListView.OnScrollListener{    Activity mActivity;     //存放当前的activity    String baseUrl = "http://10.0.2.2:8080/iShareService/servlet/";   //web服务器的地址    String imgBaseUrl = "http://10.0.2.2:8080/iShareService/images/";  //图片资源    int requestType=0;   //请求类型,0:我的分享、1:我的日记;2:我的收藏    String userName="";    String requestUrl="";    private TextView title;    private MyShareList.PaginationAdapter adapterAction;    private ScheduledExecutorService scheduledExecutorService;    private ListView listView;    private int page = 1; //请求页数    private int count = 10; //每次请求的数量    private int visibleLastIndex = 0;  //最后的可视项索引    private int visibleItemCount;    // 当前窗口可见项总数    private int dataSize = 28;     //数据集的条数    private MyShareList.PaginationAdapter adapter;    private View loadMoreView;    private Button loadMoreButton;    private Handler handler = new Handler();    //返回测试信息    /*TextView testTxt;*/    public  void refreshDiscover(){        page = 1;        visibleLastIndex = 0;        listView.setAdapter(null);   //将ListView控件的内容清空        initializeAdapter();        listView.setAdapter(adapter);        adapter.notifyDataSetChanged();    }    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_about_me);        mActivity = MyShareList.this;        //取得启动该Activity的Intent对象        Intent intent =getIntent();        //获取最新的登录状态,SharePreferences为永久存储,需要手动退出        SharedPreferences sp = MyShareList.this.getSharedPreferences("save", Context.MODE_PRIVATE);        userName = sp.getString("name","");        requestType =intent.getIntExtra("requestType",0);        //取出Intent中附加的数据        if(requestType==0){            requestUrl = baseUrl+"QueryAboutMe?username="+userName+"&type=0&page="+page+"&count="+count;        }else if(requestType==1){            requestUrl = baseUrl+"QueryAboutMe?username="+userName+"&type=1&page="+page+"&count="+count;        }else{            requestUrl = baseUrl+"QueryAboutMe?username="+userName+"&type=2&page="+page+"&count="+count;        }        loadMoreView = getLayoutInflater().inflate(R.layout.activity_find_loadmore, null);        loadMoreButton = (Button)loadMoreView.findViewById(R.id.loadMoreButton);        loadMoreButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                loadMoreButton.setText("正在加载中...");  //设置按钮文字                handler.postDelayed(new Runnable() {                    @Override                    public void run() {                        loadMoreData();                        adapter.notifyDataSetChanged();                        loadMoreButton.setText("查看更多..."); //恢复按钮文字                    }                },2000);            }        });        //返回测试信息        /* testTxt = (TextView)getActivity().findViewById(R.id.test_discover_tab);*/        listView = (ListView)findViewById(R.id.my_share_listView);        listView.addFooterView(loadMoreView);  //设置列表底部视图        initializeAdapter();        listView.setAdapter(adapter);        listView.setOnScrollListener(this);        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                TextView getTvId = (TextView)view.findViewById(R.id.cardId);                /*Toast.makeText(mActivity,"点击了"+getTvId.getText().toString()+"id", Toast.LENGTH_SHORT).show();*/                SharedPreferences sp = mActivity.getSharedPreferences("save", Context.MODE_PRIVATE);                Boolean isLogin = sp.getBoolean("isLogin",false);                if(isLogin){                    //点击了进入详情                    Intent display_info_intent = new Intent();                    display_info_intent.setClass(mActivity, DisplayDetail.class);  //创建intent对象,并制定跳转页面                    display_info_intent.putExtra("infoId",getTvId.getText().toString());                    mActivity.setResult(1, display_info_intent); //这里的1就对应到onActivityResult()方法中的resultCode                    startActivity(display_info_intent);    //跳转到详情页面                }else{                    //尚未登录                    Toast.makeText(MyShareList.this,"请先登录", Toast.LENGTH_LONG).show();                }            }        });    }    @Override    public void onScrollStateChanged(AbsListView view, int scrollState) {        int itemsLastIndex = adapter.getCount()-1; //数据集最后一项的索引        int lastIndex = itemsLastIndex + 1;        if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE                && visibleLastIndex == lastIndex) {            // 如果是自动加载,可以在这里放置异步加载数据的代码        }    }    @Override    public void onScroll(AbsListView view, int firstVisibleItem,                         int visibleItemCount, int totalItemCount) {        this.visibleItemCount = visibleItemCount;        visibleLastIndex = firstVisibleItem + visibleItemCount - 1;  //最后的可视项索引        //如果所有的记录选项等于数据集的条数,则移除列表底部视图        if(totalItemCount == dataSize+1){            listView.removeFooterView(loadMoreView);            Toast.makeText(MyShareList.this,  "数据全部加载完!", Toast.LENGTH_LONG).show();        }    }    /**     * 查询数据库中的数据     */    private JSONArray loadDataFromDataBase(String loadDataUrl){        StringBuilder stringBuilder = new StringBuilder();        BufferedReader buffer = null;        HttpURLConnection connGET = null;        try {            URL url = new URL(loadDataUrl);            connGET = (HttpURLConnection) url.openConnection();            connGET.setConnectTimeout(5000);            connGET.setRequestMethod("GET");            if (connGET.getResponseCode() == 200) {                buffer = new BufferedReader(new InputStreamReader(connGET.getInputStream()));                for (String s = buffer.readLine(); s != null; s = buffer.readLine()) {                    stringBuilder.append(s);                }                if(stringBuilder.toString()!="null"){                    //返回测试信息                    JSONArray jsonArray = new JSONArray(stringBuilder.toString());                    //获取到的数据,对Json进行解析                    page = page+1;  //一次成功请求后更新请求页面                    buffer.close();                    return jsonArray;                }else{                    return null;                }            }else{                Toast.makeText(MyShareList.this,"非200", Toast.LENGTH_LONG).show();            }        } catch (Exception e) {            e.printStackTrace();            Toast.makeText(MyShareList.this, "get 提交 err.." + e.toString(), Toast.LENGTH_LONG).show();        }        return null;    }    //初始化将详情设置到FindInfo bean中    public List initSetDataToBean(String detail){        List findInfo = new ArrayList();        try {            JSONArray detailJsonArray = new JSONArray(detail);            for (int i = 0; i < detailJsonArray.length(); i++) {                FindInfo items = new FindInfo();                JSONObject temp = (JSONObject) detailJsonArray.get(i);                Integer infoId = temp.getInt("infoId");    //内容ID                String infoTitle = temp.getString("infoTitle");   //内容标题                String infoDescribe = temp.getString("infoDescribe");   //内容简述                String infoDetail = temp.getString("infoDetail");   //内容详情                Integer type = temp.getInt("infoType");    //类型:0表示日记,1表示趣事                Integer support = temp.getInt("infoSupport");   //点赞数                String infoAuthor = temp.getString("infoAuthor");  //作者                items.setInfoId(infoId);                items.setInfoTitle(infoTitle);                items.setInfoDescribe(infoDescribe);                items.setInfoDetail(infoDetail);                items.setType(type);                items.setSupport(support);                items.setInfoAuthor(infoAuthor);                findInfo.add(items);            }            return findInfo;        }catch (JSONException e){            Toast.makeText(MyShareList.this, "initSetDataToBean异常 err.." + e.toString(), Toast.LENGTH_LONG).show();            return null;        }    }    //加载更多将详情设置到FindInfo bean中    public void loadMoreSetDataToBean(String detail){        try {            JSONArray detailJsonArray = new JSONArray(detail);            for (int i = 0; i < detailJsonArray.length(); i++) {                FindInfo items = new FindInfo();                JSONObject temp = (JSONObject) detailJsonArray.get(i);                Integer infoId = temp.getInt("infoId");    //内容ID                String infoTitle = temp.getString("infoTitle");   //内容标题                String infoDescribe = temp.getString("infoDescribe");   //内容简述                String infoDetail = temp.getString("infoDetail");   //内容详情                Integer type = temp.getInt("infoType");    //类型:0表示日记,1表示趣事                Integer support = temp.getInt("infoSupport");   //点赞数                String infoAuthor = temp.getString("infoAuthor");  //作者                items.setInfoId(infoId);                items.setInfoTitle(infoTitle);                items.setInfoDescribe(infoDescribe);                items.setInfoDetail(infoDetail);                items.setType(type);                items.setSupport(support);                items.setInfoAuthor(infoAuthor);                adapter.addNewsItem(items);   //与初始化是有差异的            }        }catch (JSONException e){            Toast.makeText(MyShareList.this, "loadMoreSetDataToBean异常 err.." + e.toString(), Toast.LENGTH_LONG).show();        }    }    /**     * 初始化ListView的适配器,即打开页面展示的数据     */    private void initializeAdapter(){        // 设置线程策略        setVersion();        JSONArray jsonArray = loadDataFromDataBase(requestUrl);        if(jsonArray!=null){            try {                JSONObject totalObject = (JSONObject)jsonArray.get(0);                dataSize = totalObject.getInt("totalRecord");  //总记录数                String detail= totalObject.getString("RecordDetail");   //详情                if(initSetDataToBean(detail)!=null) {                    adapter = new MyShareList.PaginationAdapter(initSetDataToBean(detail));   //将详情设置到bean中                }            }catch (JSONException e){                Toast.makeText(MyShareList.this, "initializeAdapter异常 err.." + e.toString(), Toast.LENGTH_LONG).show();            }        }else{            listView.removeFooterView(loadMoreView);            Toast.makeText(MyShareList.this, "查询为空" , Toast.LENGTH_LONG).show();        }    }    //APP如果在主线程中请求网络操作,将会抛出异常,所以需要用线程来操作网络请求    void setVersion() {        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()                .detectDiskReads()                .detectDiskWrites()                .detectNetwork()                .penaltyLog()                .build());        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()                .detectLeakedSqlLiteObjects() //探测SQLite数据库操作                .penaltyLog() //打印logcat                .penaltyDeath()                .build());    }    /**     * 加载更多数据     */    private void loadMoreData(){        JSONArray jsonArray = loadDataFromDataBase(requestUrl);        try {            JSONObject total = (JSONObject) jsonArray.get(0);            dataSize = total.getInt("totalRecord");  //总记录数            String detail= total.getString("RecordDetail");   //详情            loadMoreSetDataToBean(detail);   //将更多的详情设置到bean中        }catch (JSONException e){            Toast.makeText(MyShareList.this, "loadMoreData()异常 err.." + e.toString(), Toast.LENGTH_LONG).show();        }    }    /**     * 将一组数据传到ListView等UI显示组件     */    class PaginationAdapter extends BaseAdapter {        List newsItems;        public PaginationAdapter(List newsitems) {            this.newsItems = newsitems;        }        @Override        public int getCount() {            return newsItems.size();        }        @Override        public Object getItem(int position) {            return newsItems.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        //在这里将Item设置到每个卡片        @Override        public View getView(int position, View view, ViewGroup parent) {            if (view == null) {                view = getLayoutInflater().inflate(R.layout.activity_find_list_item, null);            }            //标题            TextView tvTitle = (TextView) view.findViewById(R.id.cardTitle);            tvTitle.setText(newsItems.get(position).getInfoTitle());            //文章ID            TextView tvId = (TextView) view.findViewById(R.id.cardId);            tvId.setText(newsItems.get(position).getInfoId().toString());            int type = newsItems.get(position).getType();            if (type == 0 || type == 3) {                ImageView cardImgTip = (ImageView) view.findViewById(R.id.cardImgTip);                if (type == 0) {                    cardImgTip.setImageResource(R.drawable.share_funny_select);                } else {                    cardImgTip.setImageResource(R.drawable.share_diary_select);                }                TextView tvContent = (TextView) view.findViewById(R.id.cardContent);                tvContent.setVisibility(View.VISIBLE);  //显示文字框                ImageView ivContent = (ImageView) view.findViewById(R.id.cardContent_pic);                ivContent.setVisibility(View.GONE);   //设置图片显示框隐藏                LinearLayout layoutMusic = (LinearLayout) view.findViewById(R.id.cardContent_music);                layoutMusic.setVisibility(View.GONE);   //设置音乐显示框隐藏                //分享的普通内容                tvContent.setText(newsItems.get(position).getInfoDescribe());            } else if (type == 1) {                ImageView cardImgTip = (ImageView) view.findViewById(R.id.cardImgTip);                cardImgTip.setImageResource(R.drawable.share_pic_select);                //分享图片                TextView tvContent = (TextView) view.findViewById(R.id.cardContent);                tvContent.setVisibility(View.GONE);  //隐藏文字框                LinearLayout layoutMusic = (LinearLayout) view.findViewById(R.id.cardContent_music);                layoutMusic.setVisibility(View.GONE);   //设置音乐显示框隐藏                ImageView ivContent = (ImageView) view.findViewById(R.id.cardContent_pic);                //通过网络链接获取图片                Bitmap one;                String describeUrl = newsItems.get(position).getInfoDescribe().trim();                try {                    one = LoadImgByNet.getBitmap(imgBaseUrl + describeUrl);  //设置图片                    ivContent.setImageBitmap(one);                } catch (IOException e) {                    e.printStackTrace();                }                ivContent.setVisibility(View.VISIBLE);   //设置图片显示框            } else if (type == 2) {                ImageView cardImgTip = (ImageView) view.findViewById(R.id.cardImgTip);                cardImgTip.setImageResource(R.drawable.share_music_select);                //分享的音乐                TextView tvContent = (TextView) view.findViewById(R.id.cardContent);                tvContent.setVisibility(View.GONE);  //显示文字框                ImageView ivContent = (ImageView) view.findViewById(R.id.cardContent_pic);                ivContent.setVisibility(View.GONE);   //设置图片显示框隐藏                LinearLayout layoutMusic = (LinearLayout) view.findViewById(R.id.cardContent_music);                TextView tvMusicContent = (TextView) view.findViewById(R.id.cardTitle_music);                tvMusicContent.setText(newsItems.get(position).getInfoDescribe());                layoutMusic.setVisibility(View.VISIBLE);   //设置音乐显示框显示            }            return view;        }        /**         * 添加数据列表项         *         * @param infoItem         */        public void addNewsItem(FindInfo infoItem) {            newsItems.add(infoItem);        }        }    }

 

5.iShare相关页面设计

  • 在layout下新建文件activity_about_ishare.xml,具体代码如下
  • 这个页面设计比较简单,主要就是介绍iShare应用的开发目的和实现功能,没有功能,只是展示信息
<?xml version="1.0" encoding="utf-8"?>                                                                                                    

6.“我的”页面跳转事件

  • 打开之前创建好的MyTabFragment.java文件,给对应的五个Button——“修改密码”、“查看我的分享”、“查看我的日记”、“查看我的收藏”、“查看iShare相关”添加点击监听
//“我的”页面中相关点击事件    class mClick implements View.OnClickListener {        public void onClick(View v) {            if(isLogin) {                if (v == account_set_bt) {                    //点击了账号管理                    Intent account_manage_intent = new Intent();                    account_manage_intent.setClass(mActivity, AccountManagement.class);  //创建intent对象,并制定跳转页面                    startActivity(account_manage_intent);    //跳转到账号管理页面                /*TextView textView = (TextView) getActivity().findViewById(R.id.test_text_view);  //用于放测试的提示信息                Toast.makeText(getActivity(), textView.getText(), Toast.LENGTH_LONG).show();*/                }else if(v == signature_set_bt){                    //点击了更改签名                    Intent signature_manage_intent = new Intent();                    signature_manage_intent.setClass(mActivity, ChangeSignature.class);  //创建intent对象,并指定跳转页面                    //startActivity(signature_manage_intent);    //跳转到更新签名页面                    startActivityForResult(signature_manage_intent,1);   //需要返回该页面                }else if(v == password_set_bt){                    //点击了更改密码                    Intent password_manage_intent = new Intent();                    password_manage_intent.setClass(mActivity, ChangePassword.class);  //创建intent对象,并指定跳转页面                    /*startActivity(password_manage_intent);   */                    startActivityForResult(password_manage_intent,2);   // 跳转到修改密码页面                }else if(v == share_list_bt){                    //点击了我的分享                    Intent intent = new Intent();                    intent.setClass(mActivity, MyShareList.class);  //创建intent对象,并指定跳转页面                    intent.putExtra("requestType",0);                    mActivity.setResult(4, intent); //这里的4就对应到onActivityResult()方法中的resultCode                    startActivity(intent);    //跳转到list                }else if(v==diary_list_bt){                    //点击了我的日记                    Intent intent = new Intent();                    intent.setClass(mActivity, MyShareList.class);  //创建intent对象,并指定跳转页面                    intent.putExtra("requestType",1);                    mActivity.setResult(5, intent); //这里的4就对应到onActivityResult()方法中的resultCode                    startActivity(intent);    //跳转到list                }else if(v==focus_list_bt){                    //点击了我的收藏                    Intent intent = new Intent();                    intent.setClass(mActivity, MyShareList.class);  //创建intent对象,并指定跳转页面                    intent.putExtra("requestType",2);                    mActivity.setResult(6, intent); //这里的4就对应到onActivityResult()方法中的resultCode                    startActivity(intent);    //跳转到list                } else if(v==about_iShare){                    //点击了关于iShare                    Intent about_iShare_intent = new Intent();                    about_iShare_intent.setClass(mActivity, AboutIShare.class);  //创建intent对象,并指定跳转页面                    startActivity(about_iShare_intent);    //跳转到iShare介绍页面                }            }else{                Toast.makeText(getActivity(), "请先登录!", Toast.LENGTH_LONG).show();            }        }    }

 

——到这整个iShare项目就开发完成了,整个过程可能会有部分代码或者配置不是很完整,接下来将会分模块写一下整个项目的详细代码,以及如何运行整个项目 和运行的结果

更多相关文章

  1. Android(安卓)简单的Http框架
  2. Android:自定义DialogFragment的内容和按钮
  3. android 访问/assets 和/res目录下文件的方法
  4. 一 Android(安卓)O WiFi 框架变化
  5. 浅谈Android的移动存储SharedPreferences技术
  6. Android搜索过滤
  7. android前端和java后端通过RSA加密方式传递数据时出现javax.cryp
  8. Android(安卓)沉浸状态栏
  9. Android(安卓)数据操作(一) 自定义AttributeSet属性

随机推荐

  1. Android第九讲——网络(六)xUtils
  2. AndroidStudio3.6导入项目出现unable to
  3. Android app集成友盟崩溃日志收集
  4. android使用Intent操作拨打号码发送短信
  5. AsyncTask的使用
  6. android App Widgets
  7. android 开发之坑系列_实体序列化问题
  8. 第一天学习Android的一些笔记
  9. 【HR小时制】如何获取Android系统时间的
  10. android好帖子