সম্পাদনা পাঠ্য / থেকে অনুলিপি করতে / কীভাবে আটকে দিন


131

আমার অ্যাপ্লিকেশনটিতে, একটি নিবন্ধকরণ স্ক্রিন রয়েছে, যেখানে আমি ব্যবহারকারীটিকে EditTextক্ষেত্রের মধ্যে টেক্সট অনুলিপি / আটকানোতে সক্ষম করতে চাই না । আমি onLongClickListenerপ্রতিটিতে একটি সেট রেখেছি EditTextযাতে অনুলিপি মেনু অনুলিপি / পেস্ট / ইনপুটমেডো এবং অন্যান্য বিকল্পগুলি প্রদর্শিত না হয়। সুতরাং ব্যবহারকারী সম্পাদনা ক্ষেত্রে অনুলিপি / পেস্ট করতে সক্ষম হবে না।

 OnLongClickListener mOnLongClickListener = new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            // prevent context menu from being popped up, so that user
            // cannot copy/paste from/into any EditText fields.
            return true;
        }
    };

তবে সমস্যাটি দেখা দেয় যদি ব্যবহারকারী অ্যান্ড্রয়েড ডিফল্ট ব্যতীত তৃতীয় পক্ষের কীবোর্ড সক্ষম করে থাকে, যার অনুলিপি / পেস্ট করার বোতাম থাকতে পারে বা একই প্রসঙ্গ মেনুতে প্রদর্শিত হতে পারে। তাহলে আমি কীভাবে সেই দৃশ্যে অনুলিপি / অনুলিপি করব?

কপি / পেস্ট করার পাশাপাশি অন্য উপায় আছে কিনা তা দয়া করে আমাকে জানান। (এবং সম্ভবত কীভাবে এগুলি অক্ষম করবেন)

কোন সাহায্য প্রশংসা করা হবে।


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

নোংরা সলিউশন বলে মনে হচ্ছে! যদিও এক নজর মূল্য।
rDroid

1
অ্যান্ড্রয়েড ব্যবহার করুন: দীর্ঘ ক্লিকযোগ্য = "মিথ্যা"
গুপ্ত

উত্তর:


112

আপনি যদি 11 স্তর বা তার বেশিের এপিআই স্তর ব্যবহার করে থাকেন তবে আপনি অনুলিপি, পেস্ট, কাটা এবং কাস্টম প্রসঙ্গ মেনুগুলি উপস্থিত হতে বাধা দিতে পারেন।

edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {                  
            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }
        });

অনক্রিয়াটেকশনমোড (অ্যাকশনমোড, মেনু) থেকে মিথ্যা ফিরিয়ে দেওয়া ক্রিয়াকলাপটি শুরু হতে আটকাবে (সমস্ত নির্বাচন, কাটা, অনুলিপি এবং আটকানো ক্রিয়াগুলি নির্বাচন করুন)।


1
13 এর নীচে এপিআই স্তর সম্পর্কে কি?
জনাথন

1
কোনও মন্তব্য বুঝতে না পেরে, এই নমুনাটি api11 + কাজ করে, প্রাক- api11 সেখানে আইআইআরসি অনুলিপি এবং আটকানো হয়নি
স্কটিয়াব

28
আমার জন্য কাজ করছে না blue নীল কার্সার সূচকটিতে টেপ দেওয়ার ক্ষেত্রে পাস্ত বোতামটি উপস্থিত হবে।
অকার্যকর

8
এছাড়াও আমার জন্য কাজ করে না। ডাবল আলতো চাপলে কপি-পেস্টের মেনুটি প্রদর্শিত হচ্ছে।
অ্যান্ড্রয়েড কিলার

এটা আর Android 6.0 কাজ নয়, এই উত্তর পরীক্ষা stackoverflow.com/questions/27869983/...
has19

132

সর্বোত্তম পদ্ধতিটি ব্যবহার করা:

etUsername.setLongClickable(false);

58
অথবা, কেবল android:longClickable="false"
xML এ

19
নীল কার্সার সূচকটিতে আলতো চাপানোর ক্ষেত্রে পেস্ট বোতামটি উপস্থিত হবে।
অকার্যকর

16
এটি অবশ্যই দৃশ্যকে দীর্ঘ ক্লিকযোগ্য হতে আটকাবে, তবে সম্পাদনা নিয়ন্ত্রণগুলি পাঠ্যে ডাবল ট্যাপিংয়ের মাধ্যমেও অনুরোধ করা যেতে পারে, যার অর্থ এই সমাধানটি সম্পূর্ণ নয়। আপনার উদ্দেশ্যে এটি মনে রাখবেন।
কেভিন গ্রান্ট

1
এছাড়াও, কীবোর্ড শর্টকাটগুলি এখনও (Ctrl + C) ডাব্লু / বহিরাগত কীবোর্ডগুলি কাজ করতে পারে।
ওলেগ ভাস্কেভিচ

এটি আইসক্রিম স্যান্ডউইচটিতে কাজ করে না কারণ ক্লিপবোর্ডের বিকল্পগুলি ডাবল টেপিং পাঠ্যের পাশাপাশি লম্বা আলতো চাপতেও খোলা যেতে পারে।
পল উইন্টজ

44

আপনি সম্পাদনা পাঠের দীর্ঘ প্রেসটি অক্ষম করে এটি করতে পারেন

এটি বাস্তবায়নের জন্য, কেবল এক্সএমএলে নিম্নলিখিত লাইনটি যুক্ত করুন -

android:longClickable="false"

6
সমস্যাটি ছিল আমার অ্যাপ ব্যবহারকারীর একটি তৃতীয় পক্ষের কীবোর্ড রয়েছে যার একটি অনুলিপি এবং পেস্ট বোতাম রয়েছে।
rDroid

3
আরেকটি সমস্যা হ'ল আপনি ডাবল ট্যাপ করে পাঠ্যটি নির্বাচন করতে পারেন এবং এটি আবার অনুলিপি / পেস্ট দেখায়
নিকোলা

37

আমি নিম্নলিখিতগুলি সহ অনুলিপি-কাস্ট করতে সক্ষম হয়েছি:

textField.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {
        return false;
    }

    public void onDestroyActionMode(ActionMode actionMode) {
    }
});

textField.setLongClickable(false);
textField.setTextIsSelectable(false);

আশা করি এটা তোমার জন্য কাজ করবে ;-)


উপরের অন্যান্য উত্তরের উপর ভিত্তি করে এটিই ঠিক একই সমাধান। এটি সঠিক সমাধান হিসাবে চিহ্নিত করা উচিত যেহেতু এটি প্রান্তের মামলাগুলি পরিচালনা করে যা অন্যরা করে না
অ্যান্ড্রু হফলিং

2
এই বিকল্পটি অনুলিপিটিকে ব্লক করে তবে আপনি এখনও কার্সারে ক্লিক করে পেস্ট করতে পারেন।
মেহুল কানজারিয়া

12

সমস্ত সংস্করণে সম্পাদনা পাঠের কাটা কপি পেস্ট অক্ষম করার একটি সেরা উপায় best

if (android.os.Build.VERSION.SDK_INT < 11) {
        editText.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {

            @Override
            public void onCreateContextMenu(ContextMenu menu, View v,
                    ContextMenuInfo menuInfo) {
                // TODO Auto-generated method stub
                menu.clear();
            }
        });
    } else {
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {
                // TODO Auto-generated method stub

            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode,
                    MenuItem item) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }

আমার জন্য কাজ এই, আমি শুধু @TargetApi (Build.VERSION_CODES.HONEYCOMB) যোগ করতে হয়েছে
Sheepdogsheep

11

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

পেস্ট মেনু সহ পাঠ্য নির্বাচনের হ্যান্ডেল

সমাধানটি show()নন-ডকুমেন্টেড) android.widget.Editorশ্রেণির পদ্ধতিতে পাস / রিপ্লেস মেনুটি উপস্থিত হতে বাধা দেওয়ার মধ্যে রয়েছে । মেনুটি উপস্থিত হওয়ার আগে একটি চেক করা হবে if (!canPaste && !canSuggest) return;। এই ভেরিয়েবলগুলি সেট করার জন্য যে দুটি পদ্ধতি ভিত্তি হিসাবে ব্যবহৃত হয় তা উভয়ই EditTextশ্রেণিতে থাকে:

আরও একটি সম্পূর্ণ উত্তর এখানে পাওয়া যায়


এটি সঠিক এবং সম্পূর্ণ সমাধান
ফায়ারজেঙ্ক ২en

কিছু ডিভাইসে পেস্ট ক্লিপবোর্ডের পরিবর্তে বিকল্পটি দৃশ্যমান, কেবল পেস্ট হিসাবে কাজ করে। আমি লিঙ্কগুলি চেক করেছি তবে আমি ক্লিপবোর্ডটি না করে পেস্ট আটকাতে সক্ষম। কোন ধারণা ?
রিচা

10

কোটলিন সমাধান:

fun TextView.disableCopyPaste() {
    isLongClickable = false
    setTextIsSelectable(false)
    customSelectionActionModeCallback = object : ActionMode.Callback {
        override fun onCreateActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem): Boolean {
            return false
        }

        override fun onDestroyActionMode(mode: ActionMode?) {}
    }
}

তারপরে আপনি কেবল এই পদ্ধতিটিতে কল করতে পারেন আপনার TextView:

override fun onCreate() {
    priceEditText.disableCopyPaste()
}

1
হাই, আমি এই পদ্ধতির ব্যবহার করছি, তবে আমি এই অংশে Type mismatchএই বিবরণ দিয়ে ত্রুটি পাচ্ছি । কোনও ধারণা কেন এটি কাজ করছে না? Required:ActionMode.Callback! Found: object: ActionMode.Callback
আবদুল মতিন

8

অন্যান্য সমাধানগুলি ব্যবহার করে, এপিআই 26 (ওরিও) এখনও প্রবেশ করানো পাঠ্যে একক আলতো চাপ দিয়ে কার্সার হ্যান্ডেলটি প্রদর্শন করছে এবং তারপরে মেনুটি প্রদর্শিত হতে পারে। শুধুমাত্র সমাধানের সংমিশ্রণই আমার সমস্যার সমাধান করতে পারে।

public class CustomEditText extends EditText {

    public CustomEditText(Context context) {
        super(context);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

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

    private void init() {
        this.setCustomSelectionActionModeCallback(new BlockedActionModeCallback());
        this.setLongClickable(false);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            this.setInsertionDisabled();
        }
        return super.onTouchEvent(event);
    }

    /**
    * This method sets TextView#Editor#mInsertionControllerEnabled field to false
    * to return false from the Editor#hasInsertionController() method to PREVENT showing
    * of the insertionController from EditText
    * The Editor#hasInsertionController() method is called in  Editor#onTouchUpEvent(MotionEvent event) method.
    */
    private void setInsertionDisabled() {
        try {
            Field editorField = TextView.class.getDeclaredField("mEditor");
            editorField.setAccessible(true);
            Object editorObject = editorField.get(this);

            Class editorClass = Class.forName("android.widget.Editor");
            Field mInsertionControllerEnabledField = editorClass.getDeclaredField("mInsertionControllerEnabled");
            mInsertionControllerEnabledField.setAccessible(true);
            mInsertionControllerEnabledField.set(editorObject, false);
        }
        catch (Exception ignored) {
            // ignore exception here
        }
    }

    @Override
    public boolean isSuggestionsEnabled() {
        return false;
    }

    private class BlockedActionModeCallback implements ActionMode.Callback {
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }

        public void onDestroyActionMode(ActionMode mode) {
        }
    }
}

5

আপনি যদি দীর্ঘ ক্লিক অক্ষম করতে না চান তবে সত্য প্রত্যাবর্তনের চেয়ে দীর্ঘ ক্লিকে আপনাকে কিছু কার্যকারিতা সম্পাদন করতে হবে এটি করার জন্য আরও ভাল বিকল্প।

আপনার এডিটেক্সট লম্বা ক্লিকটি এরকম হবে।

edittext.setOnLongClickListener(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
            //  Do Something or Don't
            return true;
      }
});

অনুযায়ী ডকুমেন্টেশন রিটার্নিং "TRUE" ইঙ্গিত হবে, যাতে কোন প্রয়োজন ডিফল্ট কাজগুলি করতে যে দীর্ঘ ক্লিকের ঘাঁটা করা হয়েছে।

আমি এটি এপিআই স্তরের 16, 22 এবং 25 এ পরীক্ষা করেছি Its এটি আমার পক্ষে কাজ করে। আশা করি এটি সাহায্য করবে।


1
ভাল একটা. বিকল্পভাবে, সবেমাত্র android:longClickable="false"এক্সএমএল
এলেক্স সেমেনিয়ুক

3

https://github.com/neopixl/PixlUI একটি উপলব্ধ EditTextএকটি পদ্ধতি সঙ্গে

myEditText.disableCopyAndPaste()

এবং এটি পুরানো এপিআইতে কাজ করে


1
এটি স্ট্যাকওভারফ্লো . com/a/22756538/3063884 দ্বারা সরবরাহ করা অর্ধ-সমাধানের মতো ঠিক একই কাজ করে । কোডটি দেখুন: github.com/neopixl/PixlUI/blob/master/Library/src/com/neopixl/… ... এই পন্থাটি এখনও ক্লিপবোর্ডে পাঠ্য আছে যদি "পাস" দেখায় পাঠ্য নির্বাচন হ্যান্ডলারকে আটকাতে পারে না ।
সিজেবিএস

3

"পেস্ট" পপআপ অক্ষম করার জন্য এখানে একটি হ্যাক। আপনাকে EditTextপদ্ধতিটি ওভাররাইড করতে হবে :

@Override
public int getSelectionStart() {
    for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
        if (element.getMethodName().equals("canPaste")) {
            return -1;
        }
    }
    return super.getSelectionStart();
}

অন্যান্য ক্রিয়াকলাপের জন্যও একই কাজ করা যেতে পারে।


আপনি কি ক্লিপবোর্ড অক্ষম করার জন্য বলতে পারেন
রিচা

3

আমি এই সমাধানটি পরীক্ষা করেছি এবং এটি কাজ করে

    mSubdomainEditText.setLongClickable(false);
    mSubdomainEditText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

      public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
      }

      public void onDestroyActionMode(ActionMode mode) {
      }

      public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        return false;
      }

      public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
      }
    });

1

ক্লিপবোর্ডটি পড়ুন, ইনপুটটি "টাইপ করা" হবে তার সময়টি পরীক্ষা করুন। যদি ক্লিপবোর্ডে একই পাঠ্য থাকে এবং এটি খুব দ্রুত হয় তবে আটকানো ইনপুট মুছুন।


1

@ জয়ন আলী, আপনার উত্তরটি এপিআই ১১-এ কাজ করে I আমি এপিআই 10 তেও কিছু করার পরামর্শ দিতে চেয়েছিলাম। যেহেতু আমাকে সেই সংস্করণে আমার প্রজেক্টের এপিআই বজায় রাখতে হয়েছিল, তাই আমি নিয়মিত 2.3.3 এ উপলব্ধ ফাংশনগুলির সাথে খেলছিলাম এবং এটি করার সম্ভাবনা পেয়েছি। আমি নীচে স্নিপেট শেয়ার করেছি। আমি কোডটি পরীক্ষা করেছি এবং এটি আমার জন্য কাজ করছে। আমি জরুরি ভিত্তিতে এই স্নিপেটটি করেছি। কোড পরিবর্তন করতে পারলে নির্দ্বিধায় যদি কোনও পরিবর্তন হতে পারে তবে ..

// A custom TouchListener is being implemented which will clear out the focus 
// and gain the focus for the EditText, in few milliseconds so the selection 
// will be cleared and hence the copy paste option wil not pop up.
// the respective EditText should be set with this listener 
// tmpEditText.setOnTouchListener(new MyTouchListener(tmpEditText, tmpImm));

public class MyTouchListener implements View.OnTouchListener {

    long click = 0;
    EditText mEtView;
    InputMethodManager imm;

    public MyTouchListener(EditText etView, InputMethodManager im) {
        mEtView = etView;
        imm = im;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            long curr = System.currentTimeMillis();
            if (click !=0 && ( curr - click) < 30) {

                mEtView.setSelected(false);
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mEtView.setSelected(true);
                        mEtView.requestFocusFromTouch();
                        imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                    }
                },25);

            return true;
            }
            else {
                if (click == 0)
                    click = curr;
                else
                    click = 0;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mEtView.requestFocusFromTouch();
                        mEtView.requestFocusFromTouch();
                        imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                    }
                },25);
            return true;
            }

        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            mEtView.setSelected(false);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mEtView.setSelected(true);
                    mEtView.requestFocusFromTouch();
                    mEtView.requestFocusFromTouch();
                    imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                }
            },25);
            return true;
        }
        return false;
    }

1

সমাধান খুব সহজ

public class MainActivity extends AppCompatActivity {

EditText et_0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et_0 = findViewById(R.id.et_0);

    et_0.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            //to keep the text selection capability available ( selection cursor)
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            //to prevent the menu from appearing
            menu.clear();
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }
    });
   }
}

--------> পূর্বরূপ <---------


1

প্রচলিত অনুলিপি এবং পেস্ট করার জন্য ग्राहक ক্লাস অনুসরণ করার চেষ্টা করুন Edittext

public class SegoeUiEditText extends AppCompatEditText {
private final Context context;


@Override
public boolean isSuggestionsEnabled() {
    return false;
}
public SegoeUiEditText(Context context) {
    super(context);
    this.context = context;
    init();
}

public SegoeUiEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
    init();
}

public SegoeUiEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}


private void setFonts(Context context) {
    this.setTypeface(Typeface.createFromAsset(context.getAssets(), "Fonts/Helvetica-Normal.ttf"));
}

private void init() {

        setTextIsSelectable(false);
        this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor());
        this.setLongClickable(false);

}
@Override
public int getSelectionStart() {

    for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
        if (element.getMethodName().equals("canPaste")) {
            return -1;
        }
    }
    return super.getSelectionStart();
}
/**
 * Prevents the action bar (top horizontal bar with cut, copy, paste, etc.) from appearing
 * by intercepting the callback that would cause it to be created, and returning false.
 */
private class ActionModeCallbackInterceptor implements ActionMode.Callback, android.view.ActionMode.Callback {
    private final String TAG = SegoeUiEditText.class.getSimpleName();

    public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; }
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; }
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; }
    public void onDestroyActionMode(ActionMode mode) {}

    @Override
    public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
        menu.clear();
        return false;
    }

    @Override
    public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(android.view.ActionMode mode) {

    }
}

}


1

ক্লিপবোর্ড সহ স্মার্টফোনগুলির জন্য, এটি সম্ভব প্রতিরোধ করা সম্ভব।

editText.setFilters(new InputFilter[]{new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (source.length() > 1) {
                return "";
            }  return null;
        }
    }});


0

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



0

আমার পক্ষে কাজ করা সমাধানটি হ'ল কাস্টম এডিটেক্সট তৈরি করা এবং নিম্নলিখিত পদ্ধতিটি ওভাররাইড করা:

public class MyEditText extends EditText {

private int mPreviousCursorPosition;

@Override
protected void onSelectionChanged(int selStart, int selEnd) {
    CharSequence text = getText();
    if (text != null) {
        if (selStart != selEnd) {
            setSelection(mPreviousCursorPosition, mPreviousCursorPosition);
            return;
        }
    }
    mPreviousCursorPosition = selStart;
    super.onSelectionChanged(selStart, selEnd);
}

}


0

ব্যবহার করার চেষ্টা করুন.

myEditext.setCursorVisible(false);

       myEditext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            // TODO Auto-generated method stub
            return false;
        }

        public void onDestroyActionMode(ActionMode mode) {
            // TODO Auto-generated method stub

        }

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            // TODO Auto-generated method stub
            return false;
        }

        public boolean onActionItemClicked(ActionMode mode,
                MenuItem item) {
            // TODO Auto-generated method stub
            return false;
        }
    });

0

কে কোটলিনে সমাধানের সন্ধান করছেন তিনি নীচের শ্রেণিকে কাস্টম উইজেট হিসাবে ব্যবহার করুন এবং এটি এক্সএমএল-তে ব্যবহার করুন।

সিকিউরএডিটটেক্সট ক্লাস: টেক্সটইনপুটএডিটটেক্সট {

/** This is a replacement method for the base TextView class' method of the same name. This method
 * is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
 * appears when triggered from the text insertion handle. Returning false forces this window
 * to never appear.
 * @return false
 */
override fun isSuggestionsEnabled(): Boolean {
    return false
}

override fun getSelectionStart(): Int {
    for (element in Thread.currentThread().stackTrace) {
        if (element.methodName == "canPaste") {
            return -1
        }
    }
    return super.getSelectionStart()
}

public override fun onSelectionChanged(start: Int, end: Int) {

    val text = text
    if (text != null) {
        if (start != text.length || end != text.length) {
            setSelection(text.length, text.length)
            return
        }
    }

    super.onSelectionChanged(start, end)
}

companion object {
    private val EDITTEXT_ATTRIBUTE_COPY_AND_PASTE = "isCopyPasteDisabled"
    private val PACKAGE_NAME = "http://schemas.android.com/apk/res-auto"
}

constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    disableCopyAndPaste(context, attrs)
}

/**
 * Disable Copy and Paste functionality on EditText
 *
 * @param context Context object
 * @param attrs   AttributeSet Object
 */
private fun disableCopyAndPaste(context: Context, attrs: AttributeSet) {
    val isDisableCopyAndPaste = attrs.getAttributeBooleanValue(
        PACKAGE_NAME,
        EDITTEXT_ATTRIBUTE_COPY_AND_PASTE, true
    )
    if (isDisableCopyAndPaste && !isInEditMode()) {
        val inputMethodManager =
            context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        this.setLongClickable(false)
        this.setOnTouchListener(BlockContextMenuTouchListener(inputMethodManager))
    }
}

/**
 * Perform Focus Enabling Task to the widget with the help of handler object
 * with some delay
 * @param inputMethodManager is used to show the key board
 */
private fun performHandlerAction(inputMethodManager: InputMethodManager) {
    val postDelayedIntervalTime: Long = 25
    Handler().postDelayed(Runnable {
        this@SecureEditText.setSelected(true)
        this@SecureEditText.requestFocusFromTouch()
        inputMethodManager.showSoftInput(
            this@SecureEditText,
            InputMethodManager.RESULT_SHOWN
        )
    }, postDelayedIntervalTime)
}

/**
 * Class to Block Context Menu on double Tap
 * A custom TouchListener is being implemented which will clear out the focus
 * and gain the focus for the EditText, in few milliseconds so the selection
 * will be cleared and hence the copy paste option wil not pop up.
 * the respective EditText should be set with this listener
 *
 * @param inputMethodManager is used to show the key board
 */
private inner class BlockContextMenuTouchListener internal constructor(private val inputMethodManager: InputMethodManager) :
    View.OnTouchListener {
    private var lastTapTime: Long = 0
    val TIME_INTERVAL_BETWEEN_DOUBLE_TAP = 30
    override fun onTouch(v: View, event: MotionEvent): Boolean {
        if (event.getAction() === MotionEvent.ACTION_DOWN) {
            val currentTapTime = System.currentTimeMillis()
            if (lastTapTime != 0L && currentTapTime - lastTapTime < TIME_INTERVAL_BETWEEN_DOUBLE_TAP) {
                this@SecureEditText.setSelected(false)
                performHandlerAction(inputMethodManager)
                return true
            } else {
                if (lastTapTime == 0L) {
                    lastTapTime = currentTapTime
                } else {
                    lastTapTime = 0
                }
                performHandlerAction(inputMethodManager)
                return true
            }
        } else if (event.getAction() === MotionEvent.ACTION_MOVE) {
            this@SecureEditText.setSelected(false)
            performHandlerAction(inputMethodManager)
        }
        return false
    }
}

}


0

আমি যোগ এক্সটেনশন ফাংশন মধ্যে Kotlin ভাষা:

fun EditText.disableTextSelection() {
    this.setCustomSelectionActionModeCallback(object : android.view.ActionMode.Callback {
        override fun onActionItemClicked(mode: android.view.ActionMode?, item: MenuItem?): Boolean {
            return false
        }
        override fun onCreateActionMode(mode: android.view.ActionMode?, menu: Menu?): Boolean {
            return false
        }
        override fun onPrepareActionMode(mode: android.view.ActionMode?, menu: Menu?): Boolean {
            return false
        }
        override fun onDestroyActionMode(mode: android.view.ActionMode?) {
        }
    })
}

আপনি এটি এর মতো ব্যবহার করতে পারেন:

edit_text.disableTextSelection()

আপনার এক্সএমএল এর নীচে লাইন যুক্ত করেছে:

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