2012-07-01 218 views
4

我仍然是Android的新手,我試圖繞着自動完成文本框工作。我正在使用MultiAutoCompleteTextView來填充文本框,並從字符串數組中提供提示。數組中的每個字符串都是具有一個id的對象的名稱。所以,我的問題是雙重的:Android自動完成

  • 上自動完成定條目的用戶點擊後,我如何才能找到對應於由用戶選擇的串號?

  • 是否可以在從自動完成列表中選擇的項目周圍創建一個「類似Facebook的框」,該列表與用戶可以通過按下X來刪除的原子單元一樣工作? (類似於在每一個標籤在這裏發生的事情在標籤框計算器)

在此先感謝

回答

4

Android有在郵件應用程序中使用的「芯片」小部件的源代碼。它們代表了接收消息的用戶的芯片。它們看起來就像您所指的Facebook小部件:帶有「X」的名稱可以取消。我能夠調整代碼並使其適用於我自己的需求,但說實話,它確實非常複雜,我花了很長時間來圍繞它。

核心原理是您使用Spannable字符串並手動爲背景和「X」繪製位圖。

這裏是Android源代碼:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/com/android/ex/chips/RecipientEditTextView.java

核心方法createSelectedChipconstructChipSpan

+0

嗯,不錯,這將做到這一點,謝謝!我認爲在Android中有一種「預先定義」的方式,但這給了它更大的靈活性。 :) – Sagito

+0

我們可以在我們的項目中使用這個芯片庫嗎?或者是否有任何授權問題? –

+0

自從我發佈了我的答案後,我已經發現了這個包:https://github.com/splitwise/TokenAutoComplete –

4

我開源了一個TokenAutoComplete on github,解決了這個很好。那裏似乎沒有更簡單的答案。這是一個基本實現你的描述:用於contact_token

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

佈局代碼(你需要找到自己的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> 

令牌backgound繪製

<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.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> 

這裏就是你得到的接口:

Image of working TokenAutoComplete activity

+0

我怎樣才能得到所有選定的值?我的意思是,如果用戶輸入的電子郵件地址不在定義數組列表中,那麼我們怎樣才能得到它? – Scorpion

+0

getObjects將返回字段中令牌的所有對象。如果它是一個新對象,它將是你從defaultObject返回的值 –

+0

您好先生,我有一個問題。我想刪除交叉標記圖像的onclick。我可以知道如何做這種令牌風格。 – Rajasekhar