• 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);

  • 相关阅读:
    poj 1328 Radar Installation (贪心)
    hdu 2037 今年暑假不AC (贪心)
    poj 2965 The Pilots Brothers' refrigerator (dfs)
    poj 1753 Flip Game (dfs)
    hdu 2838 Cow Sorting (树状数组)
    hdu 1058 Humble Numbers (DP)
    hdu 1069 Monkey and Banana (DP)
    hdu 1087 Super Jumping! Jumping! Jumping! (DP)
    必须知道的.NET FrameWork
    使用记事本+CSC编译程序
  • 原文地址:https://www.cnblogs.com/fengzhblog/p/2747897.html
Copyright © 2020-2023  润新知