অ্যান্ড্রয়েড: কোনও পাঠ্য প্রবেশ করা না হলে অটো কমপ্লিটটেক্সটভিউ পরামর্শ দেখায়


127

আমি ব্যবহার করছি AutoCompleteTextView, যখন ব্যবহারকারী এটিতে ক্লিক করে, আমি এর কোনও পাঠ্য না থাকলেও প্রস্তাবনাগুলি দেখাতে চাই - তবে setThreshold(0)ঠিক একইরকম কাজ করে setThreshold(1)- তাই পরামর্শগুলি প্রদর্শনের জন্য ব্যবহারকারীকে কমপক্ষে 1 টি অক্ষর প্রবেশ করতে হবে।


আমি এখানে কিছু কিছু করছি! stackoverflow.com/questions/12854336/...
toobsco42

উত্তর:


159

এটি নথিভুক্ত আচরণ :

যখন threshold0 এর চেয়ে কম বা তার সমান হয় তখন 1 এর একটি প্রান্তিক প্রয়োগ করা হয়।

আপনি নিজেই ড্রপ-ডাউন এর মাধ্যমে showDropDown()প্রদর্শন করতে পারেন, তাই আপনি যখন চান তখন এটি প্রদর্শন করার ব্যবস্থা করতে পারেন। অথবা, সাবক্লাস AutoCompleteTextViewএবং ওভাররাইড enoughToFilter(), trueসমস্ত সময় ফিরে ।


7
শোড্রপডাউন () ক্লিকলিস্টনার সেট করতে বেশ ভাল কাজ করছে বলে মনে হচ্ছে, তবে সাবক্লাস জিনিসটি কাজ করছে না যতক্ষণ না ব্যবহারকারী কোনও চিঠি প্রবেশ করে ফিরে আসে B তবে কেবল অনক্লিক দিয়ে নয় ...
এএমজে

9
এটি অনফোকাস চ্যাঞ্জলিস্টেনারের সাথে একযোগে পুরোপুরি কার্যকরভাবে কাজ করে যা দর্শন ফোকাস অর্জন করার পরে শোড্রপডাউন () কল করে।
গ্রিশকা

@ ডেভিড ভাভরা
গ্যাব্রিয়েল

4
@ কমন্সওয়্যার কখন showDropDown()কাজ করছে না । কেনafterTextChanged.getText().toString().length()==0
প্রবস

1
কেবলমাত্র যথেষ্ট পরিমাণে টোলফিল্টার আমাকে সাহায্য করে। ধন্যবাদ!
ফেদির সোপানা

121

এখানে আমার ক্লাস ইনস্ট্যান্টআউটো কমপ্লিট । এটা কিছু AutoCompleteTextViewএবং এর মধ্যে Spinner

import android.content.Context;  
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;

public class InstantAutoComplete extends AutoCompleteTextView {

    public InstantAutoComplete(Context context) {
        super(context);
    }

    public InstantAutoComplete(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }

    @Override
    public boolean enoughToFilter() {
        return true;
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction,
            Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
        if (focused && getAdapter() != null) {
            performFiltering(getText(), 0);
        }
    }

}

এটি আপনার এক্সএমএলে এটি ব্যবহার করুন:

<your.namespace.InstantAutoComplete ... />

12
দারুণ! আমি এটিও উল্লেখ করতে চাই যে আপনার লেআউট এক্সএমএল ফাইলটিতে আপনাকে পরিবর্তন <AutoCompleteTextView ... />করতে হবে <your.namespace.InstantAutoComplete ... />। আমি এটি খুঁজে পেতে কিছুটা সময় হারিয়ে ফেলেছি :)
জুলস কল

3
দুর্দান্ত শ্রেণি - কেবলমাত্র ফোকাসে পরিবর্তিত পদ্ধতিতে পরামর্শ দেওয়া হবে, "যদি (ফোকাসড)" "কে" যদি (ফোকাসড && getAdapter ()! = নাল) করা হয় তবে "পরিবর্তন করুন"।
জ্যাকব তাবাক

AndroidX এর জন্য প্রসারিত করুন androidx.appcompat.widget.AppCompatAutoCompleteTextView
মাহমুদুল হাসান শোহাগ

এটি ওরিয়েন্টেশন পরিবর্তনের উপর ড্রপডাউন দেখায় না।
মিহা_এক্স 64

45

সহজ রাস্তা:

কেবল সেটঅন্টিচলাইজন এবং শোড্রপডাউন ব্যবহার করুন ()

AutoCompleteTextView text;
.....
.....
text.setOnTouchListener(new View.OnTouchListener(){
   @Override
   public boolean onTouch(View v, MotionEvent event){
      text.showDropDown();
      return false;
   }
});

এটি আরও উন্নত করতে যদি (! Text.isPopupShowing ())। Text.showDropDown (); }
বোলদিজার পল

7
খুব সাধারণ নয়, তবে ব্যবহারকারী এই সম্পাদনা পাঠ্যে যাওয়ার জন্য যদি স্পর্শ না করে তবে এটি কাজ করবে না। উদাহরণস্বরূপ বোতামগুলির সাথে একটি রিমোট কন্ট্রোল ব্যবহার করার সময় (Android উদাহরণস্বরূপ)।
অ্যান্ড্রয়েড বিকাশকারী

2
আপনার setOnFocusChanged ব্যবহার করা উচিত। কারও কিবোর্ড থাকতে পারে এবং টিএবি বোতাম টিপতে বা মাউস এবং টাচ শ্রোতাদের ব্যবহারের জন্য কল করা হবে না।
বারউইনক্ক

অন ​​টচলিস্টনার একক ট্যাপের জন্য বিভিন্ন সময় ডাকবে - প্রাক্তন: ইভেন্টটি মোশনইভেন্ট Aঅ্যাকশন_ডাউন, মোশনইভেন্ট Aঅ্যাকশন_আপ হতে পারে। সুতরাং নির্দিষ্ট ইভেন্টের জন্য যাচাই করা এবং কোডটি লিখতে ভাল
গোবিন্দ

18

ডেসটিলের কোডটি কেবলমাত্র দুর্দান্ত কাজ করে যখন সেখানে কেবল একটি InstantAutoCompleteঅবজেক্ট থাকে। যদিও এটি দু'জনের সাথে কাজ করে নি - কেন তা জানা নেই। তবে যখন আমি showDropDown()(কমন্সওয়্যারের পরামর্শ দেওয়া ঠিক তেমন) এইরকম রাখি onFocusChanged():

@Override
protected void onFocusChanged(boolean focused, int direction,
        Rect previouslyFocusedRect) {
    super.onFocusChanged(focused, direction, previouslyFocusedRect);
    if (focused) {
        performFiltering(getText(), 0);
        showDropDown();
    }
}

এটি সমস্যার সমাধান করেছে।

এটি কেবলমাত্র দুটি উত্তর সঠিকভাবে একত্রিত, তবে আমি আশা করি এটি কারওর জন্য কিছুটা সময় সাশ্রয় করতে পারে।


2
আপনার সংযোজন সাহায্য করেছে, তবে ইনস্ট্যান্টআউটো কমপ্লিটে টেক্সট থাকলে এবং স্ক্রিনের ওরিয়েন্টেশন পরিবর্তিত হলে আমি একটি ত্রুটি পেয়েছি। আমি এটি উইন্ডোটির দৃশ্যমানতার উপর যাচাই করে ঠিক করেছি, আমি এখানে নতুন কোডটি পোস্ট করেছি: gist.github.com/furycomptuers/4961368
ফিউরি কম্পিউটারগুলি

9

অ্যাডাপ্টার প্রাথমিকভাবে ফিল্টারিং সম্পাদন করে না।
যখন ফিল্টারিং করা হয় না, ড্রপডাউন তালিকা খালি থাকে।
যাতে আপনাকে ফিল্টারিং শুরুতে পেতে হতে পারে।

এটি করতে, আপনি filter()এন্ট্রি যুক্ত করা শেষ করার পরে প্রার্থনা করতে পারেন :

adapter.add("a1");
adapter.add("a2");
adapter.add("a3");
adapter.getFilter().filter(null);

6

আপনি ফোকাস চ্যাঞ্জলিস্টনার ব্যবহার করতে পারেন;

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                TCKimlikNo.showDropDown();

            }

        }
    });

6

উপরের ডেসটিল এর উত্তর প্রায় কাজ করে, তবে একটি সূক্ষ্ম বাগ আছে। ব্যবহারকারী যখন প্রথমে কাজ করে সেই ক্ষেত্রটিতে ফোকাস দেয়, তবে যদি তারা চলে যায় এবং তারপর মাঠে ফিরে আসে তবে এটি ড্রপ ডাউনটি দেখায় না কারণ এমপপআপক্যানবিপুটেডের মানটি এটি লুকিয়ে থাকা থেকে এখনও মিথ্যা হবে। ফিক্সটি হ'ল অন ফোকাস পরিবর্তিত পদ্ধতিটি এতে পরিবর্তন করতে হবে:

@Override
protected void onFocusChanged(boolean focused, int direction,
        Rect previouslyFocusedRect) {
    super.onFocusChanged(focused, direction, previouslyFocusedRect);
    if (focused) {
        if (getText().toString().length() == 0) {
            // We want to trigger the drop down, replace the text.
            setText("");
        }
    }
}

তবে এর অর্থ হ'ল পাঠটি পুনরায় সেট করা হবে (যদিও এটি বেশিরভাগ ক্ষেত্রে ঠিক আছে) ...
অ্যান্ড্রয়েড বিকাশকারী

3

কাস্টমআউটো কমপ্লিটেক্সটভিউ তৈরি করতে। 1. ওভাররাইড সেটট্রেসোল্ড, পর্যাপ্ত টো ফিল্টার, অন ফোকাস পরিবর্তিত পদ্ধতি

public class CustomAutoCompleteTextView  extends AutoCompleteTextView { 

    private int myThreshold; 

    public CustomAutoCompleteTextView  (Context context) { 
        super(context); 
    } 

    public CustomAutoCompleteTextView  (Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 

    public CustomAutoCompleteTextView  (Context context, AttributeSet attrs) { 
        super(context, attrs); 
    } 
     //set threshold 0.
    public void setThreshold(int threshold) { 
        if (threshold < 0) { 
            threshold = 0; 
        } 
        myThreshold = threshold; 
    } 
    //if threshold   is 0 than return true
    public boolean enoughToFilter() { 
         return true;
        } 
    //invoke on focus 
    protected void onFocusChanged(boolean focused, int direction,
            Rect previouslyFocusedRect) {
                    //skip space and backspace 
        super.performFiltering("", 67);
        // TODO Auto-generated method stub
        super.onFocusChanged(focused, direction, previouslyFocusedRect);

    }

    protected void performFiltering(CharSequence text, int keyCode) {
        // TODO Auto-generated method stub
        super.performFiltering(text, keyCode);
    }

    public int getThreshold() { 
        return myThreshold; 
    } 
}

3

এটি চেষ্টা করুন

    searchAutoComplete.setThreshold(0);
    searchAutoComplete.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {//cut last probel
                    if (charSequence.length() > 1) {
                        if (charSequence.charAt(charSequence.length() - 1) == ' ') {
                            searchAutoComplete.setText(charSequence.subSequence(0, charSequence.length() - 1));
                            searchAutoComplete.setSelection(charSequence.length() - 1);
                        }
                    }
                   }


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


    //when clicked in autocomplete text view
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
              case R.id.header_search_etv:
                    if (searchAutoComplete.getText().toString().length() == 0) {
                        searchAutoComplete.setText(" ");
                    }
             break;
            }
        }):

3

এই পদ্ধতিটি কেবল স্পর্শে কল করুন বা অটো কমপ্লিটটেক্সটভিউয়ের ইভেন্টটি ক্লিক করুন বা আপনি যেখানে চান।

autoCompleteTextView.showDropDown()

0

এটি আমার জন্য কাজ করে, সিউডো কোড:

    public class CustomAutoCompleteTextView extends AutoCompleteTextView {
    public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean enoughToFilter() {
        return true;
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
        if (focused) {
            performFiltering(getText(), 0);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        this.showDropDown();
        return super.onTouchEvent(event);
    }
}


0

জাভাতে আপনার অনক্রিট পদ্ধতিতে এটি কেবল পেস্ট করুন

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
            this, android.R.layout.simple_spinner_dropdown_item,
            getResources().getStringArray(R.array.Loc_names));

    textView1 =(AutoCompleteTextView) findViewById(R.id.acT1);
    textView1.setAdapter(arrayAdapter);

    textView1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(final View arg0) {
            textView1.setMaxLines(5);
            textView1.showDropDown();

        }
    });

এবং এটি আপনার এক্সএমএল ফাইলের ...

<AutoCompleteTextView
            android:layout_width="200dp"
            android:layout_height="30dp"
            android:hint="@string/select_location"
            android:id="@+id/acT1"
            android:textAlignment="center"/>

এবং মানগুলির আওতায় স্ট্রিং.এক্সএমএলে একটি অ্যারে তৈরি করুন ...

<string-array name="Loc_names">

        <item>Pakistan</item>
        <item>Germany</item>
        <item>Russia/NCR</item>
        <item>China</item>
        <item>India</item>
        <item>Sweden</item>
        <item>Australia</item>
    </string-array>

এবং আপনি যেতে ভাল।


0

সাত বছর পরে, ছেলেরা, সমস্যাটি একই থাকে। এখানে একটি ফাংশন সহ এমন একটি শ্রেণি রয়েছে যা কোনও বেকায়দায় নিজেকে দেখানোর জন্য মূ .় পপ-আপকে বাধ্য করে। আপনাকে যা করতে হবে তা হ'ল আপনার অটো কমপ্লিট টেক্সটভিউতে একটি অ্যাডাপ্টার সেট করা, এতে কিছু ডেটা যুক্ত করা এবং showDropdownNow()যে কোনও সময় ফাংশন কল করা ।

@ ডেভিড ভভ্রা এর ক্রেডিট। এটি তার কোডের উপর ভিত্তি করে।

import android.content.Context
import android.util.AttributeSet
import android.widget.AutoCompleteTextView

class InstantAutoCompleteTextView : AutoCompleteTextView {

    constructor(context: Context) : super(context)

    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)

    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun enoughToFilter(): Boolean {
        return true
    }

    fun showDropdownNow() {
        if (adapter != null) {
            // Remember a current text
            val savedText = text

            // Set empty text and perform filtering. As the result we restore all items inside of
            // a filter's internal item collection.
            setText(null, true)

            // Set back the saved text and DO NOT perform filtering. As the result of these steps
            // we have a text shown in UI, and what is more important we have items not filtered
            setText(savedText, false)

            // Move cursor to the end of a text
            setSelection(text.length)

            // Now we can show a dropdown with full list of options not filtered by displayed text
            performFiltering(null, 0)
        }
    }
}

0

ফোকাস চ্যাঞ্জলিস্টারে, চেক করুন

if (hasFocus) {
            tvAutoComplete.setText(" ")

আপনার ফিল্টারে, কেবল এই মানটি ছাঁটাই করুন:

filter { it.contains(constraint.trim(), true) }

এবং আপনি এই দৃশ্যে ফোকাস করার সময় এটি সমস্ত পরামর্শ প্রদর্শন করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.