zoukankan      html  css  js  c++  java
  • ContactManager示例解析

    AndroidManifest.xml

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.contactmanager"
        android:versionCode="1" android:versionName="1.0">
        <application android:label="@string/app_name" android:icon="@drawable/icon">
            <activity android:name=".ContactManager" 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="ContactAdder" android:label="@string/addContactTitle">
            </activity>

        </application>
        <uses-sdk android:minSdkVersion="5" android:targetSdkVersion="5" />
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.READ_CONTACTS" />
        <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    </manifest>

    res/drawable-xxx

    drawable-hdpi/icon.png 72x72

    drawable-mdpi/icon.png 48x48

    drawable-ldpi/icon.png 32x32

    contact_manager.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="vertical"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent">
        <ListView android:layout_width="fill_parent"
                  android:id="@+id/contactList"
                  android:layout_height="wrap_content"
                  android:layout_weight="1"/>
        <CheckBox android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/showInvisible"
                  android:text="@string/showInvisible"/>
        <Button android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@+id/addContactButton"
                android:text="@string/addContactButtonLabel"/>
    </LinearLayout>

    在ContactManager.onCreate方法中

    复选框没有选中

    CheckBox mShowInvisibleControl = (CheckBox) findViewById(R.id.showInvisible);

    boolean mShowInvisible = false;
    mShowInvisibleControl.setChecked(mShowInvisible);

    复选框事件

    mShowInvisibleControl.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            Log.d(TAG, "mShowInvisibleControl changed: " + isChecked);
            mShowInvisible = isChecked;
            populateContactList();
        }
    });

    "addAccount"按钮及其事件

    Button mAddAccountButton = (Button) findViewById(R.id.addContactButton);

    mAddAccountButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Log.d(TAG, "mAddAccountButton clicked");
            launchContactAdder();
        }
    });

    在populateContactList()方法中

    获取Cursor并构造SimpleCursorAdapter对象

    Cursor cursor = getContacts();
    String[] fields = new String[] {
            ContactsContract.Data.DISPLAY_NAME
    };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor,
            fields, new int[] {R.id.contactEntryText});

    获取ListView并设置Adapter对象

    ListView mContactList = (ListView) findViewById(R.id.contactList);

    mContactList.setAdapter(adapter);

    在getContacts()方法中

    获取Uri、projection、selection, selectionArgs, sortOrder

    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] projection = new String[] {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME
    };
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
            (mShowInvisible ? "0" : "1") + "'";
    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

    调用managedQuery方法

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder);

    在launchContactAdder()方法中

    跳转到ContactAdder界面

    Intent i = new Intent(this, ContactAdder.class);
    startActivity(i);

    layout/contact_adder.xml

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
        <TableLayout android:layout_width="fill_parent"
                     android:layout_height="fill_parent">
            <TableRow>
                <TextView android:layout_width="wrap_content"
                          android:layout_height="wrap_content"
                          android:text="@string/targetAccountLabel"/>
            </TableRow>
            <TableRow>
                <Spinner android:layout_height="wrap_content"
                         android:layout_width="fill_parent"
                         android:layout_weight="1"
                         android:id="@+id/accountSpinner"/>
            </TableRow>
            <TableRow>
                <TextView android:layout_width="wrap_content"
                          android:layout_height="wrap_content"
                          android:text="@string/contactNameLabel"/>
            </TableRow>
            <TableRow>
                <EditText android:id="@+id/contactNameEditText"
                          android:layout_height="wrap_content"
                          android:layout_width="wrap_content"
                          android:layout_weight="1"/>
            </TableRow>
            <TableRow>
                <TextView android:text="@string/contactPhoneLabel"
                          android:layout_width="wrap_content"
                          android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow>
                <EditText android:id="@+id/contactPhoneEditText"
                          android:layout_height="wrap_content"
                          android:layout_width="wrap_content"
                          android:layout_weight="1"/>
                <Spinner android:id="@+id/contactPhoneTypeSpinner"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow>
                <TextView android:text="@string/contactEmailLabel"
                          android:layout_width="wrap_content"
                          android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow>
                <EditText android:id="@+id/contactEmailEditText"
                          android:layout_height="wrap_content"
                          android:layout_width="wrap_content"
                          android:layout_weight="1"/>
                <Spinner android:id="@+id/contactEmailTypeSpinner"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"/>
            </TableRow>
            <TableRow>
                <Button android:layout_height="wrap_content"
                        android:text="@string/save"
                        android:id="@+id/contactSaveButton"
                        android:layout_width="fill_parent"
                        android:layout_weight="1"/>
            </TableRow>
        </TableLayout>
    </ScrollView>

    在AccountData构造方法(如下)中

    AccountData(String name, AuthenticatorDescription description)

    mType = description.type;

    String packageName = description.packageName;
    PackageManager pm = getPackageManager(); 

    mTypeLabel = pm.getText(packageName, description.labelId, null);

    10-31 15:20:21.576: INFO/contactMgr(14321): description.type = com.sonyericsson.localcontacts
    10-31 15:20:21.576: INFO/contactMgr(14321): description.packageName = com.sonyericsson.localcontacts
    10-31 15:20:21.576: INFO/contactMgr(14321): description.labelId = 2130968576
    10-31 15:20:21.576: INFO/contactMgr(14321): mTypeLabel = 手机联系人
    10-31 15:20:21.576: INFO/contactMgr(14321): description.type = com.google
    10-31 15:20:21.576: INFO/contactMgr(14321): description.packageName = com.google.android.gsf
    10-31 15:20:21.576: INFO/contactMgr(14321): description.labelId = 2131165435
    10-31 15:20:21.576: INFO/contactMgr(14321): mTypeLabel = Google

    layout/account_entry.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:padding="6dip">
        <ImageView
            android:id="@+id/accountIcon"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_alignParentTop="true"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="6dip" />
        <TextView
            android:id="@+id/secondAccountLine"
            android:layout_width="fill_parent"
            android:layout_height="26dip"
            android:layout_toRightOf="@id/accountIcon"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:textColor="@android:color/secondary_text_light" />
        <TextView
            android:id="@+id/firstAccountLine"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/accountIcon"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_above="@id/secondAccountLine"
            android:layout_alignWithParentIfMissing="true"
            android:gravity="center_vertical"
            android:textColor="@android:color/primary_text_light"/>
    </RelativeLayout>

    在AccountAdapter.getDropDownView(int position, View convertView, ViewGroup parent)方法中

    1. 构造convertView

    if (convertView == null) {
        LayoutInflater layoutInflater = getLayoutInflater();
        convertView = layoutInflater.inflate(R.layout.account_entry, parent, false);
    }

    2. 获取convertView中的子View

    TextView firstAccountLine = (TextView) convertView.findViewById(R.id.firstAccountLine);
    TextView secondAccountLine = (TextView) convertView.findViewById(R.id.secondAccountLine);
    ImageView accountIcon = (ImageView) convertView.findViewById(R.id.accountIcon);

    3. 给子View赋值

    AccountData data = getItem(position);
    firstAccountLine.setText(data.getName());
    secondAccountLine.setText(data.getTypeLabel());
    Drawable icon = data.getIcon();
    if (icon == null) {
        icon = getResources().getDrawable(android.R.drawable.ic_menu_search);
    }
    accountIcon.setImageDrawable(icon);

    在AccountAdapter构造方法中

    1. 设置DropDownViewResource

    setDropDownViewResource(R.layout.account_entry);

    在接口OnAccountsUpdateListener中

    1. 声明抽象方法onAccountsUpdated

    public abstract void onAccountsUpdated(Account[] paramArrayOfAccount);

  • 相关阅读:
    css 中关于border-color 继承了color的说明
    关于飞书的相关开发案例
    好看的点赞设计
    较好的设计网站参考
    较好的B端设计体验 说明
    基于vue的流程图插件
    较好看的中后台模板(ui)
    前端笔记-201807
    前端笔记(201905-201906)
    前端笔记(201902-201904)
  • 原文地址:https://www.cnblogs.com/fengzhblog/p/2747897.html
Copyright © 2011-2022 走看看