0

Android 4.1に組み込まれているメッセージングアプリのような新規メッセージ作成画面を作ろうとしています

  1. 人が連絡先を選択すると、AutoCompleteTextView にボタンのようなものが挿入されていることに気付きました。そんなことがあるものか?開始コードを提供する考えさえないので、助けてください。PS : 新しい投稿を作成するときに、StackOverflow の「タグ」エントリのようなものを実装したいと思います。つまり、単語 (一致した連絡先) がボタンに置​​き換えられ、右端に小さな X が表示されて削除されます! :-)

  2. 非常に高速にロードされるアダプターをどのように作成しますか? 1 つのアイデアは、すべての連絡先 (名前、電話番号、電話番号の種類) のリストをキャッシュすることです。他のアイデアはありますか?(たとえば、たとえば 2 文字の初期検索文字列を使用してコンテンツ プロバイダーにクエリを実行できれば、オートコンプリートの結果の数が大幅に削減され、アダプターの読み込みにかかる時間が短縮されます。もちろん、これには設定が必要です。各文字が入力されたときの autocompletetextview のアダプター.私の疑問は、Cursor を使用して最初からデータベース全体をスキャンするのではなく、ContactsContract にクエリを実行して、特定の文字で始まる検索結果を取得できるかどうかです。)

  3. autocompletetextview はスペースを認識せず、結果が得られません。私はすでにこれを読んでいます が、実装できませんでした。誰かがこれのための作業コードを持っていますか?

4

2 に答える 2

0

これを行う簡単な方法がないように見えたため、この問題を解決するためにTokenAutoCompleteを構築しました。ポイント1と3を解決する基本的な例を次に示します。

public class ContactsCompletionView extends TokenCompleteTextView {
    public ContactsCompletionView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected View getViewForObject(Object object) {
        Person p = (Person)object;

        LayoutInflater l = (LayoutInflater)getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        LinearLayout view = (LinearLayout)l.inflate(R.layout.contact_token, (ViewGroup)ContactsCompletionView.this.getParent(), false);
        ((TextView)view.findViewById(R.id.name)).setText(p.getName());

        return view;
    }

    @Override
    protected Object defaultObject(String completionText) {
        //Stupid simple example of guessing if we have an email or not
        int index = completionText.indexOf('@');
        if (index == -1) {
            return new Person(completionText, completionText.replace(" ", "") + "@example.com");
        } else {
            return new Person(completionText.substring(0, index), completionText);
        }
    }
}

contact_token のレイアウト コード (独自の x ドローアブルを見つける必要があります)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/token_background">
    <TextView android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="14sp"
        android:text="Test Me"
        android:padding="2dp" />

    <ImageView
        android:layout_height="10dp"
        android:layout_width="10dp"
        android:src="@drawable/x"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="3dp"
        android:layout_marginRight="5dp" />
</LinearLayout>

トークン バックグラウンド ドローアブル

<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#ffafafaf" />
    <corners
        android:topLeftRadius="5dp"
        android:bottomLeftRadius="5dp"
        android:topRightRadius="5dp"
        android:bottomRightRadius="5dp" />
</shape>

人物オブジェクトコード

public class Person implements Serializable {
    private String name;
    private String email;

    public Person(String n, String e) { name = n; email = e; }

    public String getName() { return name; }
    public String getEmail() { return email; }

    @Override
    public String toString() { return name; }
}

サンプル活動

public class TokenActivity extends Activity {
    ContactsCompletionView completionView;
    Person[] people;
    ArrayAdapter<Person> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        people = new Person[]{
                new Person("Marshall Weir", "marshall@example.com"),
                new Person("Margaret Smith", "margaret@example.com"),
                new Person("Max Jordan", "max@example.com"),
                new Person("Meg Peterson", "meg@example.com"),
                new Person("Amanda Johnson", "amanda@example.com"),
                new Person("Terry Anderson", "terry@example.com")
        };

        adapter = new ArrayAdapter<Person>(this, android.R.layout.simple_list_item_1, people);

        completionView = (ContactsCompletionView)findViewById(R.id.searchView);
        completionView.setAdapter(adapter);
        completionView.setTokenClickStyle(TokenCompleteTextView.TokenClickStyle.Delete);
    }
}

レイアウトコード

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.tokenautocomplete.ContactsCompletionView
        android:id="@+id/searchView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

外観は次のとおりです。

ここに画像の説明を入力

于 2013-10-22T23:21:45.190 に答える
0

組み込みのメッセージング アプリのソース コードは、Android GitHubで自由に参照できます。必要なのは、コードを読んで理解するための忍耐だけです。また、すべてのコードがパブリック SDK に含まれているわけではないので、使用には注意してください。

1、連絡先タグRecipientEditTextViewを持つ MultiAutoComplete 。RecipientsEditorは拡張されたクラスであり、RecipientEditTextViewアプリの Update で使用します。これが作成画面のレイアウトです。37 行目は、必要な autocompletetextview です。以下はそのレイアウトです。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">

<com.android.mms.ui.RecipientsEditor
    android:id="@+id/recipients_editor"
    android:hint="@string/to_hint"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textFilter"
    android:layout_weight="1"
    android:textColor="#000000"
/>

<ImageButton android:id="@+id/recipients_picker"
    android:src="@drawable/ic_launcher_contacts"
    android:layout_marginLeft="5dip"
    android:layout_width="50dip"
    android:layout_height="fill_parent"
    android:layout_weight="0"
    android:visibility="gone"
/>

于 2012-09-17T14:00:19.777 に答える