web-dev-qa-db-ja.com

Android EditText Gmailはフィールドに入力したい

私はアプリで作業していて、「To」フィールドのようなGmailを作成しようとしています。このフィールドには、一度追加すると編集できず、完全に削除されるだけのブロックがあります(添付画像のように)。それも画像を持つことができれば、それは完璧です。 gmail "To" field

38
Ciprian

この技術は「チップ」と呼ばれ、Roman Nurikが Google+の投稿 で説明しています。次に、彼は ここでのStackOverflowでのMacarseの回答 を指しています。次に、これらは、ストックメッセージングクライアントに表示される このUIの実装 をポイントします。

30
CommonsWare

私はソリューションをオープンソース化しました githubのTokenAutoComplete 。鉱山は2.2に戻ってテストされています。非常に単純な実装とカスタマイズを可能にするようにコードを設計しました。

これが私のライブラリを使用した実装例です。

サブクラスTokenCompleteTextView

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.getEmail());

        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のレイアウトコード(ここでは任意の種類のレイアウトを使用できますが、トークンに画像が必要な場合はImageViewをスローできます)

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_height="wrap_content"
    Android:layout_width="wrap_content">

    <TextView Android:id="@+id/name"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="@drawable/token_background"
        Android:padding="5dp"
        Android:textColor="@Android:color/white"
        Android:textSize="18sp" />

</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", "[email protected]"),
                new Person("Margaret Smith", "[email protected]"),
                new Person("Max Jordan", "[email protected]"),
                new Person("Meg Peterson", "[email protected]"),
                new Person("Amanda Johnson", "[email protected]"),
                new Person("Terry Anderson", "[email protected]")
        };

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

        completionView = (ContactsCompletionView)findViewById(R.id.searchView);
        completionView.setAdapter(adapter);
        completionView.setPrefix("To: ");
    }
}

レイアウトコード

<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>
11
Marshall Weir