অ্যান্ড্রয়েডে ক্লিক করুন ক্লিক করুন সম্পাদনা করুন


86

আমি একটি সম্পাদনা পাঠ্য চাই যা টিপলে ডেটপিকার তৈরি করে। সুতরাং আমি নিম্নলিখিত কোড লিখুন:

    mEditInit = (EditText) findViewById(R.id.date_init);
    mEditInit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(DATEINIT_DIALOG);
        }

    });

তবে আমি যখন সম্পাদনা পাঠ্য টিপব তখন ক্রিয়াটি সাধারণত: একটি পাঠ্য টাইপ করার জন্য অপেক্ষা করা কার্সার পরিবর্তে আমার পছন্দসই ডায়ালগটি দেখায়।


আপনার সম্পাদনা ডায়ালগের পরিবর্তে কোনও স্পিনার ব্যবহার করা উচিত।
রায়ান আর

উত্তর:


129

এডিটেক্সট ফোকাস পাওয়ার পরে কীবোর্ডটি পপ আপ হয়ে যাবে বলে মনে হচ্ছে। এটি প্রতিরোধ করতে, মিথ্যাতে দৃষ্টি নিবদ্ধযোগ্য সেট করুন:

<EditText
    ...
    android:focusable="false"
    ... />

এই আচরণটি বিভিন্ন নির্মাতাদের অ্যান্ড্রয়েড ওএস স্বাদে পৃথক হতে পারে তবে আমি যে ডিভাইসগুলি পরীক্ষা করেছি সেগুলিতে আমি এটি পর্যাপ্ত হিসাবে পেয়েছি। যদি কীবোর্ডটি এখনও পপ আপ হয় তবে পাঠ্যের পরিবর্তে ইঙ্গিতগুলি ব্যবহার করাও সহায়তা করবে বলে মনে হয়:

myEditText.setText("My text");    // instead of this...
myEditText.setHint("My text");    // try this

এটি হয়ে গেলে আপনার ক্লিক শ্রোতাদের পছন্দ মতো কাজ করা উচিত:

myEditText.setOnClickListener(new OnClickListener() {...});

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

60

সাধারণত, আপনি EditTextস্বাভাবিক আচরণের সাথে সর্বাধিক সামঞ্জস্যতা চান ।

সুতরাং আপনার হ্যাঁ হিসাবে ব্যবহার করা উচিত নয়android:focusable="false" , দৃশ্যটি দেখতে কেবল ফোকাসযোগ্য হবে না যা দেখতে খারাপ। পটভূমি অঙ্কনযোগ্য এর উদাহরণ "উদাহরণস্বরূপ" তার আর "চাপবে না"।

পরিবর্তে আপনার যা করা উচিত তা হ'ল:

myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // showMyDialog();
    }
});
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // showMyDialog();
        }
    }
});

ইনপুট প্রকারটি সেট করে TYPE_NULL, আপনি সফ্টওয়্যার কীবোর্ডকে পপ আপ করতে বাধা দিন।

OnClickListenerএবং সেট করে OnFocusChangeListenerআপনি নিশ্চিত হয়েছিলেন যে ব্যবহারকারী যখন EditTextক্ষেত্রটিতে ক্লিক করে তখনই আপনার ডায়লগটি সর্বদা খোলা থাকবে , যখন এটি ফোকাস অর্জন করবে (প্রথম ক্লিক করুন) এবং পরবর্তী ক্লিকগুলি উভয়ই।

কেবল স্থাপন android:inputType="none"বা setInputType(InputType.TYPE_NULL)সর্বদা পর্যাপ্ত নয়। কিছু ডিভাইসগুলির জন্য, আপনার android:editable="false"এক্সএমএল এও সেট করা উচিত , যদিও এটি অবনতিযুক্ত। যদি এটি আর কাজ না করে তবে এটি কেবল উপেক্ষা করা হবে (সমস্ত এক্সএমএল বৈশিষ্ট্য যা সমর্থিত নয়)।


আমি যখন এটি করি, ডায়ালগটি বন্ধ হয়ে যাওয়ার পরে এটি পুনরায় খোলে কারণ এডিটেক্সট লাভগুলি আবার ফোকাস করে। কোন উপায় এই কাছাকাছি?
AdamMc331

@ ম্যাকএডাম 331 EditTextসম্ভবত সেই উপাদানটিই কি আপনার লেআউটের একমাত্র উইজেট? আপনি কি android:focusable="true"আপনার পিতামাতার বিন্যাসে যুক্ত করার চেষ্টা করতে পারেন ?
কাওয়

4
@ কেউ প্রতিক্রিয়া জানাতে ধন্যবাদ, তবে আমি এটি টাচ ব্যবহার করে কাজটি শেষ করেছি। ধন্যবাদ!
AdamMc331

এটাই. ভাল কাজ করছে।
জিউউইং

31

আমারও একই সমস্যা ছিল কোডটি ঠিক আছে তবে আপনি এডিটেক্সটের ফোকাসযোগ্য মানটিকে মিথ্যাতে পরিবর্তন করেছেন তা নিশ্চিত করুন।

<EditText
android:id="@+id/date"
android:focusable="false"/>

আমি আশা করি এটি যে কারও সমান সমস্যা রয়েছে তাদের সহায়তা করবে!


4
সক্ষম = "মিথ্যা" সেট নাও করুন, যা ক্লিকলিস্টেনার
ওটস

25

এর ডিফল্ট কাজ EditText: প্রথম ক্লিকে এটি ফোকাস করে এবং দ্বিতীয় ক্লিকে এটি পরিচালনা করে onClickListenerযাতে আপনার ফোকাস অক্ষম করতে হবে। তারপরে প্রথমে onClickListenerউইল হ্যান্ডেল ক্লিক করুন ।

এটি করার জন্য আপনাকে এই android:focusableInTouchMode="false"বৈশিষ্ট্যটি আপনার নিজেরতে যুক্ত করতে হবে EditText। এটাই!

এটার মতো কিছু:

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="false"
        android:inputType="text" />

4
এটি কাজ করে, তবে EditTextঅযোগ্য হয়ে যায় এবং কার্সারটি উপস্থিত হয় না।
কুলমাইন্ড

17

আমি প্রয়োগ করা সমাধান এখানে

mPickDate.setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        showDialog(DATE_DIALOG_ID);
        return false;
    }
});

বা

mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        showDialog(DATE_DIALOG_ID);

    }
});

নিজের দ্বারা পার্থক্যগুলি দেখুন। সমস্যাটি তখন থেকেই (রিকনটফ্রেডের মতো) টেক্সটভিউ তারিখ প্রদর্শন করতে এবং ডেটপিকারের মাধ্যমে সম্পাদনা করার জন্য। TextEdit এর প্রাথমিক উদ্দেশ্যে ব্যবহৃত হয় না। আপনি যদি ডেটপিকারটি পুনঃ-পপ আপ করতে চান তবে আপনাকে মুছে ফেলতে হবে (1 ম কেস) বা ডি ফোকাস (2 য় কেস)।

রশ্মি


4
আপনি যদি অনক্লিকলিস্টনার যুক্ত না করেন যা আমি সবেমাত্র একটি অন ফোকাস চেঞ্জলিস্টেনারের সাথে একসাথে করেছি। এটি কাজ করবে :-)
neteinstein

দ্বিতীয় সমাধানটি আমার পক্ষে কাজ করেছে, আপনাকে ধন্যবাদ! :)
সেল্টিক

10

আপনি যদি সম্পাদনা পাঠ্যে অনক্লিক অ্যাকশন ব্যবহার করেন তবে:

জাভা:

mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATEINIT_DIALOG);
    }

});

বা কোটলিন:

editTextChooseDate.setOnClickListener {
        showDialog(DATEINIT_DIALOG)
    }

সুতরাং, এটা পুরোপুরি কাজ করবে যদি আপনি পুরা xmlআপনার এর EditTextনিম্নলিখিত পংক্তিগুলি:

অ্যান্ড্রয়েড: ইনপুটটাইপ = "কিছুই নয়"
অ্যান্ড্রয়েড: ফোকাসযোগ্য = "মিথ্যা"
অ্যান্ড্রয়েড: কার্সারভিজিবল = "মিথ্যা"

উদাহরণ স্বরূপ:

<EditText
            android:id="@+id/date_init" 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:hint="Select Date"
            android:inputType="none"
            android:focusable="false"
            android:cursorVisible="false"/>

বা ম্যাটেরিয়াল ডিজাইনের জন্য

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/layoutEditTextChooseDate"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

    <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/date_init" 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:hint="Select Date"
            android:inputType="none"
            android:focusable="false"                      
            android:cursorVisible="false"/>

</com.google.android.material.textfield.TextInputLayout>

8

আইএমএইচও আমি রিকনটফ্রেডের বক্তব্যের সাথে একমত নই:

কোনও সম্পাদনা পাঠ্য ফোকাস পেলে একটি ডায়ালগ পপ করা একটি অ-মানক ইন্টারফেসের মতো মনে হয়।

তারিখটি সম্পাদনা করার জন্য একটি ডায়ালগ প্রদর্শন করা যখন ব্যবহারটি চাপলে কোনও এডিটেক্সট ডিফল্টর সাথে খুব মিল, যা কোনও কীবোর্ড বা একটি সংখ্যার কী প্যাড প্রদর্শন করা হয়। তারিখটি সম্পাদনা পাঠ্য সংকেত ব্যবহারকারীর সাথে প্রদর্শিত হয় যে তারিখটি পরিবর্তিত হতে পারে। তারিখটি পরিবর্তনযোগ্য নয় এমন ব্যবহারিকের কাছে অ-সম্পাদনযোগ্য টেক্সটভিউ সিগন্যালের হিসাবে প্রদর্শন করা হচ্ছে।


7

দুর্দান্ত বিষয়। ঠিক আছে, আমি তাই করেছি। এক্সএমএল ফাইলটিতে:

<EditText
    ...
    android:editable="false"
    android:inputType="none" />

জাভা-কোডে:

txtDay.setOnClickListener(onOnClickEvent);
txtDay.setOnFocusChangeListener(onFocusChangeEvent);

private View.OnClickListener onOnClickEvent = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        dpDialog.show();
    }
};
private View.OnFocusChangeListener onFocusChangeEvent = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
            dpDialog.show();
    }
};

6

নিম্নলিখিত আমার জন্য নিখুঁতভাবে কাজ করে।

সফ্ট কীবোর্ডকে পপ আপ হতে বাধা দিতে প্রথমে আপনার তারিখ চয়নকারী উইজেটের ইনপুটটি 'কোনও নয়' তে সেট করুন:

<EditText android:inputType="none" ... ></EditText>

তারপরে এই ইভেন্ট শ্রোতাদের সাথে তারিখ চয়নকারী যুক্ত ডায়ালগটি দেখানোর জন্য যুক্ত করুন:

// Date picker
EditText dateEdit = (EditText) findViewById(R.id.date);
dateOfBirthEdit.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            showDialog(DIALOG_DATE_PICKER);
        }
        return false;
    }
});

dateEdit.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            showDialog(DIALOG_DATE_PICKER);
        } else {
            dismissDialog(DIALOG_DATE_PICKER);
        }
    }
});

গত এক জিনিস. তারিখ চয়নকারী থেকে টাইপ করা দিন, মাস বা বছর সঠিকভাবে অনুলিপি করা হয়েছে তা নিশ্চিত করতে datePicker.clearFocus(), উদাহরণগুলির মাধ্যমে মানগুলি পুনরুদ্ধার করার আগে কল করুন getMonth()


সাধারণ ফিক্স: প্রতিটি শো ডায়ালগের আগে ডায়ালগকে বরখাস্ত করুন, কেবলমাত্র নিশ্চিত হতে।
লুকাস বাত্তেউ

5

এটি আমার পক্ষে কাজ করে:

mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setKeyListener(null);
mEditInit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus)
            {
                mEditInit.callOnClick();
            }
        }
    });
mEditInit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATEINIT_DIALOG);
    }

});

3

আমার জন্য যা কাজ করেছে তা এখানে

মিথ্যাতে সম্পাদনযোগ্য সেট করুন

<EditText android:id="@+id/dob"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Date of Birth"
android:inputType="none"
android:editable="false"

/>

তারপরে অনফোকাস চেঞ্জের জন্য ইভেন্ট শ্রোতা যুক্ত করুন

private  View.OnFocusChangeListener onFocusChangeDOB= new View.OnFocusChangeListener() {

@Override
 public void onFocusChange(View v, boolean hasFocus) {
   if (hasFocus){
     showDialog(DATE_DIALOG_ID);
   }
 }
};

4
অ্যান্ড্রয়েড 2.3.x চালিত মটোরোলা ফোনগুলি থেকে সাবধান থাকুন। এডিটটেক্সট যদি কোনও স্ক্রোলযোগ্য জায়গায় থাকে তবে মোটরোলা যখন আপনি স্ক্রোল করবেন তখন স্বয়ংক্রিয়ভাবে ফোকাস সরিয়ে নিয়ে যাবে। এর অর্থ আপনি নীচে স্ক্রোল করতে পারেন এবং এডিটেক্সট ফোকাস লাভ করলে আপনার তারিখের ডায়ালগটি পপ আপ হয় যা অবাক করা এবং খারাপ bad
এরিক বার্ক

2

ডিলন কেয়ার্নসের পরামর্শ অনুসারে, মিথ্যা কাজগুলিতে ফোকাসযোগ্য সেট তৈরি করা। তবে যদি আপনার লক্ষ্যটি সম্পাদনা পাঠ্য ক্লিক করা হয় তখন কীবোর্ডটি বাতিল করতে হয়, আপনি সম্ভবত এটি ব্যবহার করতে চান:

mEditText.setInputType(0);

2

কেন কেউ উল্লেখ করেননি setOnTouchListener? ব্যবহার setOnTouchListenerকরা সহজ এবং ঠিক আছে, এবং শ্রোতা যদি ইভেন্টটি গ্রাস করে, অন্যথায় মিথ্যা হয় তবেই সত্যটিতে ফিরে আসুন।


0

অনফোকাস চ্যাঞ্জলিস্টেনার ব্যবহার করে সমাধানগুলির সাথে সমস্যা হ'ল তারা যে কোনও ফোকাস লাভকে ক্লিক হিসাবে ব্যাখ্যা করে। এটি 100% সঠিক নয়: আপনার এডিটেক্সট ক্লিকের চেয়ে অন্য কোনও বিষয় থেকে ফোকাস পেতে পারে।

আপনি যদি ক্লিকের বিষয়ে কঠোরভাবে যত্নশীল হন এবং ধারাবাহিকভাবে ক্লিক সনাক্ত করতে চান (ফোকাস নির্বিশেষে), আপনি এটি ব্যবহার করতে পারেন GestureDetector:

editText.setOnConsistentClickListener { /* do something */ }

fun EditText.setOnConsistentClickListener(doOnClick: (View) -> Unit) {
    val gestureDetector = GestureDetectorCompat(context, object : GestureDetector.SimpleOnGestureListener() {
        override fun onSingleTapUp(event: MotionEvent?): Boolean {
            doOnClick(this@setOnConsistentClickListener)
            return false
        }
    })

    this.setOnTouchListener { _, motionEvent -> gestureDetector.onTouchEvent(motionEvent) }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.