• android 学习随笔二十八(应用小知识点小结 )


    • 去掉标题栏的方法

    第一种:也一般入门的时候经常使用的一种方法
    requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
    注意这句一定要写在setContentView()方法的前面,不然会报错的

    第二种:在AndroidManifest.xml文件中定义
    <application android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar">
    可以看出,这样写的话,整个应用都会去掉标题栏,如果只想去掉某一个Activity的标题栏的话,可以把这个属性加到activity标签里面

    注:这种方法在android4.1.1的三星i9300手机上TabHost中不起作用,需要采用第一种方式加上setTheme一起控制。
    setTheme(android.R.style.Theme_Black_NoTitleBar);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.api_tab_host);

    第三种:自定义样式,在一般的应用中不常用,在res/values目录下面新建一个style.xml的文件
    例如:
    <?xml version="1.0" encoding="UTF-8" ?>
    <resources>
    <style name="notitle">
    <item name="android:windowNoTitle">true</item>
    </style>
    </resources>
    相当于一个主题,然后在AndroidManifest.xml文件中定义

    <application android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/notitle">
    达到去掉标题栏的效果

    第一种有的时候我们会看到,会先出现标题栏,然后再消失,因为是在activity的oncreate方法中定义的。
    第二种相对第一种比较好一些,不会出现这种情况。
    第三种可以把功能分开,便于维护和扩展,但比较麻烦。

    ------------------------------------------------------

    • 全屏的方法

    第一种
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    第二种
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

    第三种
    application android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/fullscreem"

    • ListView自动滑动

    <activity android:name="com.itheima.momo.ui.activity.ConversationDetailActivity"
    android:windowSoftInputMode="stateUnspecified|adjustResize"
    ></activity>

    public void initView() {
    setContentView(R.layout.activity_conversation_detail);

    lv_conversation_detail = (ListView) findViewById(R.id.lv_conversation_detail);
    et_conversation_detail = (EditText) findViewById(R.id.et_conversation_detail);
    bt_conversation_detail_send = (Button) findViewById(R.id.bt_conversation_detail_send);

    //只要ListView刷新,就会滑动
    lv_conversation_detail.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    }

    • 发送短信与接收发送结果
    package com.itheima.momo.dao;
    
    import java.util.List;
    
    import com.itheima.momo.globle.Constant;
    import com.itheima.momo.receiver.SendSmsReceiver;
    
    import android.app.PendingIntent;
    import android.content.ContentValues;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.SmsManager;
    
    public class SmsDao {
    
        public static void sendSms(Context context, String address, String body){
            SmsManager manager = SmsManager.getDefault();
            List<String> smss = manager.divideMessage(body);
            
            Intent intent = new Intent(SendSmsReceiver.ACTION_SEND_SMS);
            //短信发出去后,系统会发送一条广播,告知我们短信发送是成功还是失败
            PendingIntent sentIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
            for (String text : smss) {
                //这个api只负责发短信,不会把短信写入数据库
                manager.sendTextMessage(address, null, text, sentIntent, null);
            
                //把短信插入短信数据库
                insertSms(context, address, text);
            }
        }
        
        public static void insertSms(Context context, String address, String body){
            //只要插入address就可以了,thread_id不需要插入,这个会自动识别的。 
            ContentValues values = new ContentValues();
            values.put("address", address);
            values.put("body", body);
            values.put("type", Constant.SMS.TYPE_SEND);
            
            context.getContentResolver().insert(Constant.URI.URI_SMS, values);
        }
    }
    View Code
    package com.itheima.momo.receiver;
    
    import com.itheima.momo.utils.ToastUtils;
    
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class SendSmsReceiver extends BroadcastReceiver {
        
        public static final String ACTION_SEND_SMS = "com.itheima.momo.sendsms";
        @Override
        public void onReceive(Context context, Intent intent) {
            int code = getResultCode();
            if(code == Activity.RESULT_OK ){
                ToastUtils.ShowToast(context, "发送成功");
            }
            else{
                ToastUtils.ShowToast(context, "发送失败");
            }
        }
    
    }
    View Code
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.itheima.momo"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
        <uses-permission android:name="android.permission.READ_SMS"/>
        <uses-permission android:name="android.permission.READ_CONTACTS"/>
        <uses-permission android:name="android.permission.WRITE_SMS"/>
        <uses-permission android:name="android.permission.SEND_SMS"/>
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.itheima.momo.ui.activity.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            
            <activity android:name="com.itheima.momo.ui.activity.ConversationDetailActivity"
                android:windowSoftInputMode="stateUnspecified|adjustResize"
                ></activity>
            
            <activity android:name="com.itheima.momo.ui.activity.NewMsgActivity"></activity>
            
            <receiver android:name="com.itheima.momo.receiver.SendSmsReceiver">
                <intent-filter >
                    <action android:name="com.itheima.momo.sendsms"/>
                </intent-filter>
            </receiver>
            
            <provider android:name="com.itheima.momo.provider.GroupProvider"
                android:exported="true"
                android:authorities="com.itheima.momo"
                ></provider>
        </application>
    
    </manifest>
    View Code
    •  利用接口定义常量

    public class Constant {

    public interface URI{
    Uri URI_SMS_CONVERSATION = Uri.parse("content://sms/conversations");
    Uri URI_SMS = Uri.parse("content://sms");
    Uri URI_GROUP_INSERT = Uri.parse("content://com.itheima.momo/groups/insert");
    }
    public interface SMS{
    int TYPE_RECEIVE = 1;
    int TYPE_SEND = 2;
    }
    }

    • 创建数据库
    package com.itheima.momo.dao;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class GroupOpenHelper extends SQLiteOpenHelper {
    
        //单例模式获取GroupOpenHelper实例
        private static GroupOpenHelper instance;
        
        public static GroupOpenHelper getInstance(Context context){
            if(instance == null){
                instance = new GroupOpenHelper(context, "group.db", null, 1);
            }
            return instance;
        }
        
        private GroupOpenHelper(Context context, String name, CursorFactory factory,
                int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            //创建groups表
            db.execSQL("create table groups(" +
                    "_id integer primary key autoincrement, " +
                    "name varchar, " +
                    "create_date integer, " +
                    "thread_count integer" + 
                    ")");
            //创建会话和群组的映射表
            db.execSQL("create table thread_group(" +
                    "_id integer primary key autoincrement, " +
                    "group_id integer, " +
                    "thread_id integer" + 
                    ")");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
    
        }
    
    }
    View Code
    • 定义内容提供者
    public class GroupProvider extends ContentProvider {
    
        GroupOpenHelper helper;
        private SQLiteDatabase db;
        
        static final int CODE_GROUPS_INSERT = 0;
        
        UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
        
        private final String authority = "com.itheima.momo";
        {
            //添加匹配规则
            //authority是主机名,//path是要匹配的路径
            matcher.addURI(authority , "groups/insert", CODE_GROUPS_INSERT);
        }
        @Override
        public boolean onCreate() {
            helper = GroupOpenHelper.getInstance(getContext());
            db = helper.getWritableDatabase();
            return false;
        }
    
        @Override
        public Cursor query(Uri uri, String[] projection, String selection,
                String[] selectionArgs, String sortOrder) {
            return null;
        }
    
        @Override
        public String getType(Uri uri) {
            return null;
        }
    
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            switch (matcher.match(uri)) {
            case CODE_GROUPS_INSERT:
                long rawId= db.insert("groups", null, values);
                //插入失败
                if(rawId == -1){
                    return null;
                }
                else{
                    //把返回的行id,拼接在uri的后面,然后返回
                    return ContentUris.withAppendedId(uri, rawId);
                }
                
            default:
                break;
            }
            return null;
        }
    
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
            return 0;
        }
    
        @Override
        public int update(Uri uri, ContentValues values, String selection,
                String[] selectionArgs) {
            return 0;
        }
    
    }
    GroupProvider.java
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.itheima.momo"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
        <uses-permission android:name="android.permission.READ_SMS"/>
        <uses-permission android:name="android.permission.READ_CONTACTS"/>
        <uses-permission android:name="android.permission.WRITE_SMS"/>
        <uses-permission android:name="android.permission.SEND_SMS"/>
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.itheima.momo.ui.activity.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            
            <activity android:name="com.itheima.momo.ui.activity.ConversationDetailActivity"
                android:windowSoftInputMode="stateUnspecified|adjustResize"
                ></activity>
            
            <activity android:name="com.itheima.momo.ui.activity.NewMsgActivity"></activity>
            
            <receiver android:name="com.itheima.momo.receiver.SendSmsReceiver">
                <intent-filter >
                    <action android:name="com.itheima.momo.sendsms"/>
                </intent-filter>
            </receiver>
            
            <provider android:name="com.itheima.momo.provider.GroupProvider"
                android:exported="true"
                android:authorities="com.itheima.momo"
                ></provider>
        </application>
    
    </manifest>
    AndroidManifest.xml
    import android.content.ContentValues;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    
    import com.itheima.momo.R;
    import com.itheima.momo.base.BaseFragment;
    import com.itheima.momo.globle.Constant;
    
    public class GroupFragment extends BaseFragment {
    
        private Button bt_group_newgroup;
    
        @Override
        public View initView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            View view = inflater.inflate(R.layout.fragment_group, null);
            bt_group_newgroup = (Button) view.findViewById(R.id.bt_group_newgroup);
            return view;
        }
    
        @Override
        public void initListener() {
            bt_group_newgroup.setOnClickListener(this);
    
        }
    
        @Override
        public void initData() {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void processClick(View v) {
            switch (v.getId()) {
            case R.id.bt_group_newgroup:
                ContentValues values = new ContentValues();
                values.put("name", "天下英雄基本也就这几个了");
                values.put("create_date", System.currentTimeMillis());
                values.put("thread_count", 0);
                getActivity().getContentResolver().insert(Constant.URI.URI_GROUP_INSERT, values);
                break;
    
            }
    
        }
    
    }
    GroupFragment.java
    •  自动下拉列表条
    package com.itheima.momo.adapter;
    
    import com.itheima.momo.R;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.CursorAdapter;
    import android.widget.TextView;
    
    public class AutoSearchAdapter extends CursorAdapter {
    
        @SuppressWarnings("deprecation")
        public AutoSearchAdapter(Context context, Cursor c) {
            super(context, c);
        }
        
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return View.inflate(context, R.layout.item_auto_search_tv, null);
        }
        
        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            ViewHolder holder = getHolder(view);
            holder.tv_autosearch_name.setText(cursor.getString(cursor.getColumnIndex("display_name")));
            holder.tv_autosearch_address.setText(cursor.getString(cursor.getColumnIndex("data1")));
        }
        
        private ViewHolder getHolder(View view) {
            ViewHolder holder = (ViewHolder) view.getTag();
            if(holder == null){
                holder = new ViewHolder(view);
                view.setTag(holder);
            }
            return holder;
        }
        
        class ViewHolder{
            private TextView tv_autosearch_name;
            private TextView tv_autosearch_address;
    
            public ViewHolder(View view) {
                tv_autosearch_name = (TextView) view.findViewById(R.id.tv_autosearch_name);
                tv_autosearch_address = (TextView) view.findViewById(R.id.tv_autosearch_address);
            }
        }
        
        //点击下拉列表条目时的返回值
        @Override
        public CharSequence convertToString(Cursor cursor) {
            return cursor.getString(cursor.getColumnIndex("data1"));
        }
    }
    AutoSearchAdapter.java
    package com.itheima.momo.ui.activity;
    
    import android.content.Intent;
    import android.database.Cursor;
    import android.net.Uri;
    import android.provider.ContactsContract.CommonDataKinds.Phone;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.AutoCompleteTextView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.FilterQueryProvider;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.itheima.momo.R;
    import com.itheima.momo.adapter.AutoSearchAdapter;
    import com.itheima.momo.base.BaseActivity;
    import com.itheima.momo.dao.SmsDao;
    import com.itheima.momo.utils.CursorUtils;
    import com.itheima.momo.utils.ToastUtils;
    
    public class NewMsgActivity extends BaseActivity {
    
        //这个组件显示联系人列表也是使用Adapter来设置列表条目
        private AutoCompleteTextView et_newmsg_address;
        private EditText et_newmsg_body;
        private AutoSearchAdapter adapter;
        private ImageView iv_newmsg_select_contact;
        private Button bt_newmsg_send;
    
        @Override
        public void initView() {
            setContentView(R.layout.activity_newmsg);
            et_newmsg_address = (AutoCompleteTextView) findViewById(R.id.et_newmsg_address);
            et_newmsg_body = (EditText) findViewById(R.id.et_newmsg_body);
            iv_newmsg_select_contact = (ImageView) findViewById(R.id.iv_newmsg_select_contact);
            bt_newmsg_send = (Button) findViewById(R.id.bt_newmsg_send);
            
            //这是下拉列表的背景
            et_newmsg_address.setDropDownBackgroundResource(R.drawable.bg_btn_normal);
            //这是下拉列表的竖直偏移
            et_newmsg_address.setDropDownVerticalOffset(5);
        }
    
        @Override
        public void initListener() {
            iv_newmsg_select_contact.setOnClickListener(this);
            bt_newmsg_send.setOnClickListener(this);
        }
    
        @Override
        public void initData() {
            adapter = new AutoSearchAdapter(this, null);
            //给输入框设置adapter,该adapter负责显示输入框的下拉列表
            et_newmsg_address.setAdapter(adapter);
            
            adapter.setFilterQueryProvider(new FilterQueryProvider() {
                
                //这个方法的调用,是用来执行查询
                //constraint:用户在输入框中输入的号码,也就是模糊查询的条件
                @Override
                public Cursor runQuery(CharSequence constraint) {
                    String[] projection = {
                            "data1",
                            "display_name",
                            "_id"
                    };
                    //模糊查询
                    String selection = "data1 like '%" + constraint + "%'";
                    Cursor cursor = getContentResolver().query(Phone.CONTENT_URI, projection, selection, null, null);
    //                CursorUtils.printCursor(cursor);
                    
                    //返回cursor,就是把cursor交给adapter
                    return cursor;
                }
            });
            
            initTitleBar();
    
        }
    
        @Override
        public void processClick(View v) {
            switch (v.getId()) {
            case R.id.iv_titlebar_back_btn:
                finish();
                break;
            case R.id.iv_newmsg_select_contact:
                //跳转至系统提供的联系人选择Activity
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("vnd.android.cursor.dir/contact");
                //使用startActivityForResult启动,那么选好联系人,该Activity销毁,回调onActivityResult
                startActivityForResult(intent, 0);
                break;
            case R.id.bt_newmsg_send:
                String address = et_newmsg_address.getText().toString();
                String body = et_newmsg_body.getText().toString();
                if(!TextUtils.isEmpty(address) && !TextUtils.isEmpty(body)){
                    SmsDao.sendSms(this, address, body);
                }
                break;
            }
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            //data中会携带一个uri,就是用户选择的联系人的uri
            Uri uri = data.getData();
            if(uri != null){
                //查询这个uri,获取联系人的id和是否有号码
                String[] projection = {
                        "_id",
                        "has_phone_number"
                };
                //不需要where条件,因为uri是“一个”联系人的uri
                Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
                //不需要判断是否查到,但是必须移动指针
                cursor.moveToFirst();
                String _id = cursor.getString(0);
                int has_phone_number = cursor.getInt(1);
                
                if(has_phone_number == 0){
                    ToastUtils.ShowToast(this, "该联系人没有号码");
                }
                else{
                    //如果有号码,拿着联系人id去Phone.CONTENT_URI查询号码
                    String selection = "contact_id = " + _id;
                    Cursor cursor2 = getContentResolver().query(Phone.CONTENT_URI, new String[]{"data1"}, selection, null, null);
                    cursor2.moveToFirst();
                    String data1 = cursor2.getString(0);
                    
                    et_newmsg_address.setText(data1);
                    //内容输入框获取焦点
                    et_newmsg_body.requestFocus();
                }
            }
        }
        
        private void initTitleBar() {
            findViewById(R.id.iv_titlebar_back_btn).setOnClickListener(this);
            ((TextView)findViewById(R.id.tv_titlebar_title)).setText("发送短信");
    
        }
    }
    NewMsgActivity.java
    •  对话框默认不支持文本输入,手动把一个输入框设置为对话框的内容,让android自动弹出输入键盘

    //本类中提供静态方法,获取本类的对象。
    public static void showDialog(Context context, String title, OnInputDialogListener onInputDialogListener){
    InputDialog dialog = new InputDialog(context, title, onInputDialogListener);
    //对话框默认不支持文本输入,手动把一个输入框设置为对话框的内容,Android自动对其进行设置(设置的文本框会被布局文件覆盖)
    dialog.setView(new EditText(context));
    dialog.show();
    }

    • TextView添加图标
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:background="@drawable/selector_item_grouplist_bg"
        >
        <!--最左边的图片就是孤零零的图片上面没有加上任何的功能,所以直接在textview中利用属性实现  -->
        <TextView 
            android:id="@+id/tv_grouplist_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="群组名字"
            android:textSize="16sp"
            android:drawableLeft="@drawable/img_group"
            android:drawablePadding="5dp"
            android:gravity="center_vertical"
            />
        <TextView 
            android:id="@+id/tv_grouplist_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="12:78pm"
            android:textSize="15sp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            />
        
    </RelativeLayout>
    View Code
    •  改变ListView的点击背景

    1、去掉原来的背景

    <ListView
    android:id="@+id/lv_group_list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:listSelector="@android:color/transparent"
    ></ListView>

    2、设置ITEM的背景

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:background="@drawable/selector_item_grouplist_bg"
    >
    <!--最左边的图片就是孤零零的图片上面没有加上任何的功能,所以直接在textview中利用属性实现 -->
    <TextView
    android:id="@+id/tv_grouplist_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="群组名字"
    android:textSize="16sp"
    android:drawableLeft="@drawable/img_group"
    android:drawablePadding="5dp"
    android:gravity="center_vertical"
    />
    <TextView
    android:id="@+id/tv_grouplist_date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="12:78pm"
    android:textSize="15sp"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    />

    </RelativeLayout>

    ----------------------------------------------------------------------------------------

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@color/item_grouplist_normal" android:state_pressed="false"></item>
    <item android:drawable="@color/item_grouplist_press" android:state_pressed="true"></item>

    </selector>

     --------------------------------------------------------------------------------------------------

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <color name="item_grouplist_normal">#ffffff</color>
    <color name="item_grouplist_press">#33666666</color>
    </resources>

    • 自定义数据库刷新

    import com.itheima.momo.dao.GroupOpenHelper;

    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;

    public class GroupProvider extends ContentProvider {

    GroupOpenHelper helper;
    private SQLiteDatabase db;
    private static final String TABLE_GROUPS = "groups";
    private static final String TABLE_THREAD_GROUP = "thread_group";

    private static final String authority = "com.itheima.momo";
    public static final Uri BASE_URI = Uri.parse("content://" + authority);

    static final int CODE_GROUPS_INSERT = 0;
    static final int CODE_GROUPS_QUERY = 1;
    static final int CODE_GROUPS_UPDATE = 2;
    static final int CODE_GROUPS_DELETE = 3;
    static final int CODE_THREAD_GROUP_INSERT = 4;
    static final int CODE_THREAD_GROUP_QUERY = 5;
    static final int CODE_THREAD_GROUP_UPDATE = 6;
    static final int CODE_THREAD_GROUP_DELETE = 7;

    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    {
    //添加匹配规则
    matcher.addURI(authority , "groups/insert", CODE_GROUPS_INSERT);
    matcher.addURI(authority , "groups/query", CODE_GROUPS_QUERY);
    matcher.addURI(authority , "groups/update", CODE_GROUPS_UPDATE);
    matcher.addURI(authority , "groups/delete", CODE_GROUPS_DELETE);
    matcher.addURI(authority , "thread_group/insert", CODE_THREAD_GROUP_INSERT);
    matcher.addURI(authority , "thread_group/query", CODE_THREAD_GROUP_QUERY);
    matcher.addURI(authority , "thread_group/update", CODE_THREAD_GROUP_UPDATE);
    matcher.addURI(authority , "thread_group/delete", CODE_THREAD_GROUP_DELETE);
    }
    @Override
    public boolean onCreate() {
    helper = GroupOpenHelper.getInstance(getContext());
    db = helper.getWritableDatabase();
    return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
    String[] selectionArgs, String sortOrder) {

    switch (matcher.match(uri)) {
    //这个是表示不同的表,根据id判断出不同的表然后选择插入。
    case CODE_GROUPS_QUERY:
    Cursor cursor = db.query(TABLE_GROUPS, projection, selection, selectionArgs, null, null, sortOrder);

    //监视uri上数据改变一个的内容观察者
    //只要该uri上的数据改变,内容观察者会立刻发现,重新查询
    cursor.setNotificationUri(getContext().getContentResolver(), BASE_URI);
    return cursor;
    case CODE_THREAD_GROUP_QUERY:
    cursor = db.query(TABLE_THREAD_GROUP, projection, selection, selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), BASE_URI);
    return cursor;
    default:
    throw new IllegalArgumentException("未识别的uri:" + uri);
    }
    }

    @Override
    public String getType(Uri uri) {
    return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
    switch (matcher.match(uri)) {
    case CODE_GROUPS_INSERT:
    long rawId = db.insert(TABLE_GROUPS, null, values);
    //插入失败
    if(rawId == -1){
    return null;
    }
    else{
    //这个是自己创建的数据库只能调用notifychange方法,让其帮忙刷新。
    getContext().getContentResolver().notifyChange(BASE_URI, null);
    //把返回的行id,拼接在uri的后面,然后返回
    return ContentUris.withAppendedId(uri, rawId);
    }
    case CODE_THREAD_GROUP_INSERT:
    rawId = db.insert(TABLE_THREAD_GROUP, null, values);
    //插入失败
    if(rawId == -1){
    return null;
    }
    else{
    getContext().getContentResolver().notifyChange(BASE_URI, null);
    //把返回的行id,拼接在uri的后面,然后返回
    return ContentUris.withAppendedId(uri, rawId);
    }

    default:
    throw new IllegalArgumentException("未识别的uri:" + uri);
    }
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
    switch (matcher.match(uri)) {
    case CODE_GROUPS_DELETE:
    int number = db.delete(TABLE_GROUPS, selection, selectionArgs);
    getContext().getContentResolver().notifyChange(BASE_URI, null);
    return number;
    case CODE_THREAD_GROUP_DELETE:
    number = db.delete(TABLE_THREAD_GROUP, selection, selectionArgs);
    getContext().getContentResolver().notifyChange(BASE_URI, null);
    return number;
    default:
    throw new IllegalArgumentException("未识别的uri:" + uri);
    }
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
    String[] selectionArgs) {
    switch (matcher.match(uri)) {
    case CODE_GROUPS_UPDATE:
    int number = db.update(TABLE_GROUPS, values, selection, selectionArgs);
    getContext().getContentResolver().notifyChange(BASE_URI, null);
    return number;
    case CODE_THREAD_GROUP_UPDATE:
    number = db.update(TABLE_THREAD_GROUP, values, selection, selectionArgs);
    getContext().getContentResolver().notifyChange(BASE_URI, null);
    return number;
    default:
    throw new IllegalArgumentException("未识别的uri:" + uri);
    }
    }

    }

    • final

         在Java中声明属性、方法和类时,可使用关键字final来修饰。
         final变量即为常量,只能赋值一次;
         final方法不能被子类重写;
         final类不能被继承。
    • 编辑框设置图标

    <EditText
    android:id="@+id/et_search_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_btn_normal"
    android:drawableLeft="@drawable/icon_search"
    android:singleLine="true"
    android:textSize="16sp"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    />

    • LIstview去掉横线和背景设置

    <ListView
    android:id="@+id/lv_search_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@null"
    android:listSelector="@android:color/transparent"
    ></ListView>

    • 在LISTVIEW中隐藏输入法软键盘

    lv_search_list.setOnScrollListener(new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    //输入法管理器
    //隐藏输入法软键盘
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getActivity().getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
    int visibleItemCount, int totalItemCount) {

    }
    });

    • 限制TextViewW文字行数,以及添加“...”

    <TextView
    android:id="@+id/tv_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="5dp"
    android:layout_toRightOf="@+id/iv_icon"
    android:ellipsize="end"
    android:maxLines="2"
    android:text="否决了卡萨大军阀流口水大军阀卢卡斯的家乐福卡睡大觉了看法就死定了看风景"
    android:textColor="#000"
    android:textSize="18sp" />

    • ImageView显示方式(对齐、裁剪centercrop等)

    <ImageView
    android:id="@+id/iv_icon"
    android:layout_width="100dp"
    android:layout_height="65dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="#9e9e9e"
    android:padding="1dp"
    android:scaleType="fitXY"
    android:src="@drawable/image_demo" />

  • 相关阅读:
    DetailsView应用之雕虫小技
    Javascript 调用C# 代码并传递参数的两种方法
    一键还原后,重装一遍 bartender7.75软件, 添加空白标签的时候提示 无法找到字体,无法在没文字情况下运行 求电脑帝解释
    JS处理Enter键触发执行的操作
    SoundManager 2 实现web页面中嵌入声音播放
    用Nexus搭建Maven远程仓库[私服]
    AmCharts一款统计图表及股票图表的插件
    HTML5添加网页音效
    Jquerymenuaim流畅的菜单滑动体验
    UML之JUDE{Astah}使用介绍
  • 原文地址:https://www.cnblogs.com/ecollab/p/5977576.html
Copyright © 2020-2023  润新知