2012-10-02 30 views
29

Tôi có một AutoCompleteTextView trong ứng dụng của mình. Ứng dụng này sử dụng SDK Facebook. Tôi đã theo mã từ câu hỏi này trên SO: https://stackoverflow.com/a/12363961/450534 đến dấu chấm và có hoạt động tìm kiếm (lọc) hoạt động.Android: Tự động hoàn thành TextView Tương tự như Ứng dụng Facebook

Bây giờ, làm cách nào để có được Tự động hoàn thành nội dòng như Ứng dụng Facebook sau khi biểu tượng @ được nhập và vẫn giữ văn bản khác do người dùng nhập? Hoạt động được đề cập là để cập nhật trạng thái và có thể chứa Bạn bè của người dùng cùng với văn bản khác. AutoCompleteTextView hoặc EditText sẽ tự nhiên là một dòng nhiều dòng. Để cập nhật trạng thái bạn thấy.

Tôi biết vì thiếu bất kỳ mã nào trong bài đăng này, tôi có nguy cơ bị giảm giá hoặc thậm chí có thể đóng câu hỏi. Nhưng nó thực sự là một tiêu chuẩn danh sách tấm lọc lò hơi tiêu chuẩn.

CHỈNH SỬA: Ứng dụng FriendCaster dành cho Android cũng không thay đổi.

+0

http://techdroid.kbeanie.com/2010/04/custom-autocomplete-for-android.html Điều gì đó giống như vậy có thể giúp bạn Ý tưởng ??? – Omarj

+0

Không có giải pháp hộp cho việc này, một cách là bạn có thể dịch ngược ứng dụng Facebook và xem mã. Có rất nhiều trình giải mã có sẵn. Nhưng những gì họ đang làm cơ bản là mở rộng EditText View và tùy biến nó theo nhu cầu của họ. Tôi nghĩ rằng twitter cũng vậy. – Nitin

+0

@Nitin: Tôi không hoàn toàn chắc chắn rằng tôi muốn loại bỏ tác phẩm của người khác. Bên cạnh đó, ngay cả khi tôi đã làm điều đó, tốt nhất, tôi sẽ chỉ nhận được XML của họ. Không phải JAVA của họ mà tôi tin là điều cần thiết. –

Trả lời

34

Trước tiên, hãy chỉnh sửa EditText của bạn thành một MultiAutoCompleteTextView. Một MultiAutoCompleteTextView cho phép bạn thay thế các phần nhất định của văn bản, ví dụ như văn bản sau '@'.

Các bạn có thể làm một cái gì đó như thế này:

final MultiAutoCompleteTextView inputEditText = (MultiAutoCompleteTextView) dialog.findViewById(R.id.MyEditText); 

String[] COUNTRIES = new String[] { "Belgium", "France", "Italy", "Germany", "Spain" }; 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); 
inputEditText.setAdapter(adapter); 
inputEditText.setThreshold(1); //Set number of characters before the dropdown should be shown 

//Create a new Tokenizer which will get text after '@' and terminate on ' ' 
inputEditText.setTokenizer(new Tokenizer() { 

    @Override 
    public CharSequence terminateToken(CharSequence text) { 
    int i = text.length(); 

    while (i > 0 && text.charAt(i - 1) == ' ') { 
     i--; 
    } 

    if (i > 0 && text.charAt(i - 1) == ' ') { 
     return text; 
    } else { 
     if (text instanceof Spanned) { 
     SpannableString sp = new SpannableString(text + " "); 
     TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0); 
     return sp; 
     } else { 
     return text + " "; 
     } 
    } 
    } 

    @Override 
    public int findTokenStart(CharSequence text, int cursor) { 
    int i = cursor; 

    while (i > 0 && text.charAt(i - 1) != '@') { 
     i--; 
    } 

    //Check if token really started with @, else we don't have a valid token 
    if (i < 1 || text.charAt(i - 1) != '@') { 
     return cursor; 
    } 

    return i; 
    } 

    @Override 
    public int findTokenEnd(CharSequence text, int cursor) { 
    int i = cursor; 
    int len = text.length(); 

    while (i < len) { 
     if (text.charAt(i) == ' ') { 
     return i; 
     } else { 
     i++; 
     } 
    } 

    return len; 
    } 
}); 

Một "vấn đề" với điều này là popup sẽ xuất hiện dưới cái nhìn EditText. Để di chuyển nó lên và đặt nó dưới văn bản mà hiện tại đang viết cho bạn có thể làm một cái gì đó như thế này:

inputEditText.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    Layout layout = inputEditText.getLayout(); 
    int pos = inputEditText.getSelectionStart(); 
    int line = layout.getLineForOffset(pos); 
    int baseline = layout.getLineBaseline(line); 

    int bottom = inputEditText.getHeight(); 

    inputEditText.setDropDownVerticalOffset(baseline - bottom); 

    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
    } 
}); 

Lưu ý: Đây không hiện chăm sóc của vị trí thả xuống trong trường hợp đó có nhiều dòng trong edittext so với edittext có thể hiển thị.

+1

Chính xác những gì tôi cần! Làm việc như người ở. :-) –

+0

Tôi có thể hỏi thêm một câu hỏi nữa không? Bất kể bạn trả lời hay không, tiền thưởng là của bạn. –

+0

Hỏi đi, không thể hứa tôi có thể trả lời mặc dù :) – Heinrisch

0

https://github.com/dhaval001/linkable_text_view.git

Cách đơn giản để tạo ra văn bản liên kết, chẳng hạn như @username hoặC#hashtag, trong Android TextView và EditText với TextView multiautocomplete. link facebook và instagram

Tính năng

trận đấu dây đơn hoặc mẫu regex để thiết lập liên kết Thay đổi màu sắc của văn bản liên kết Đặt phong cách của văn bản liên kết: đậm, nghiêng, hoặc BOLD_ITALIC Đặt gạch chân của văn bản được liên kết Chỉ định các hành động nhấp của một từ cụ thể Trình nghe OnTextChangedListener cho LinkableEditText

Các vấn đề liên quan