android संपादन टेस्ट संदर्भ मेनू अक्षम करें




android-edittext contextmenu (4)

मैं पारंपरिक मंगोलियाई के लिए एक लंबवत EditText बना रहा हूं मैंने एक घुमाए गए ViewGroup अंदर एक थोड़ा संशोधित EditText को एम्बेड करके इसे सफलतापूर्वक कार्यान्वित किया है मुझे पूरी तरह से कस्टम संदर्भ मेनू बनाने की आवश्यकता है क्योंकि सिस्टम एक ऊर्ध्वाधर पाठ का समर्थन नहीं करता है और जब ViewGroup घूमता है तब भी घूमता नहीं है। इसलिए मैं सिस्टम संदर्भ मेनू पूरी तरह से अक्षम करना चाहता हूं

ध्यान दें कि ये इन सवालों से भिन्न है जो सिर्फ कॉपी / पेस्ट / आदि अक्षम करने का प्रयास कर रहे हैं।

यद्यपि मुझे सिम्युलेटर में दिखाई देने वाले संदर्भ मेनू नहीं मिलता है, तो मैं इसे मेरे एंड्रॉइड 5.0.2 ज़ियामी फोन में दिखता हूं।

मैं प्रयास कर चुका हूं:

  • setCustomSelectionActionModeCallback "समाधान"
  • setLongClickable(false); "उपाय"
  • onTouchEvent "समाधान"

मैं हैक्स के लिए खुला रहा हूँ, लेकिन मुझे इसकी ज़रूरत है कि वह लगातार उपकरणों पर काम करे। मार्क मर्फी (ए कॉमन्स गाय) ने कुछ समय पहले एक और उपयोगकर्ता के जवाब में लिखा था जो कुछ ऐसा करने की कोशिश कर रहा था:

मुझे संदेह है कि अगर आप एक जवाब के साथ आएंगे तो यह सभी उपकरणों पर काम नहीं करेगा। डिटेक्ट निर्माताओं के संपादन मेनू के लिए अपने स्वयं के "संदर्भ मेनू" को रोल करने की प्रवृत्ति थी, जो उस संदर्भ मेनू में आइटम जोड़ने के डेवलपर्स के प्रयासों को हराते थे मेरा अनुमान है कि संदर्भ मेनू को ब्लॉक करने का प्रयास करना समान परिणाम होगा

मेरा भाग्य साथ नहीं दे रहा?

केवल एक चीज जो मैं सोच सकता हूँ वह अब तक TextView और EditText को पूरी तरह से फिर से लिखना है (ठीक है, एंड्रॉइड स्रोत संशोधित करके) मैं किसी और को जानता हूं जो कुछ समान था, लेकिन उसका कोड खुला स्रोत नहीं है इससे पहले कि मैं यह बड़ा कदम उठाऊं, मैं स्टैक ओवरफ्लो पर यहां एक सरल समाधान की मांग करना चाहता हूं।

अपडेट: मैं पिछले दो दिनों से TextView स्रोत कोड को संशोधित करने का प्रयास कर रहा हूं और यह 6 महीने की प्रोजेक्ट की तरह दिखता है यह अंतरग्रस्त वर्गों का एक द्रव्यमान है। मुझे एक और समाधान की आवश्यकता है, लेकिन मैं विचारों से बाहर हूं

MVCE

यह सबसे आसान तरीका है जिससे मैं समस्या को पुन: बनाने की सोच सकता हूं। मेरे कस्टम EditText से कुछ भी जरूरी नहीं है लेआउट में एक एकल EditText है जिसे डिफ़ॉल्ट प्रोजेक्ट हैलो वर्ल्ड के TextView । मैंने मिटि एपीआई को 11 से बदल दिया है, जो नापसंद तरीके से निपटने से बचने के लिए है।

public class MainActivity extends AppCompatActivity {

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

        EditText editText = (EditText) findViewById(R.id.edit_text);
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
            @Override
            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { return false; }
            @Override
            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { return false; }
            @Override
            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { return false; }
            @Override
            public void onDestroyActionMode(ActionMode actionMode) { }
        });
    }
}

सिम्युलेटर (एपीआई 24 चल रहा है) में संदर्भ मेनू अभी भी दिखाता है जब मैं कर्सर हैंडल पर क्लिक करता हूं (लेकिन लंबे क्लिक या डबल क्लिक पर नहीं)। यहां एक छवि है:

एंड्रॉइड 5.0 चलाने वाले मेरे ज़ियामी एमआईयूआई फोन पर, मुझे हर परिस्थिति में संदर्भ मेनू मिलता है (कर्सर हैंडल क्लिक, लंबी क्लिक, डबल क्लिक)।

अद्यतन करें

अरिट्रा राय का समाधान सिम्युलेटर में काम कर रहा है, कुछ अन्य डिवाइसेज पर उन्होंने परीक्षण किया है, और मेरे डिवाइस पर। मैंने उसका जवाब स्वीकार कर लिया है क्योंकि यह मेरी मूल समस्या को हल करता है केवल नकारात्मक पक्ष प्रभाव यह है कि पाठ चयन भी अक्षम है।


तीन चीजें हैं जिनकी आपको ज़रूरत है

चरण 1

आप इन तरीकों से गलत लौटने के द्वारा संदर्भ मेनू को प्रदर्शित करने से अक्षम कर सकते हैं,

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

चरण 2

संपादन टेक्स्ट में लंबे समय तक क्लिक को अक्षम करना भी आवश्यक है।

mEditText.setLongClickable(false);

या ऐसा करने के लिए, android:longClickable="false" XML में android:longClickable="false"

चरण 3

अब, जब मेनू पर हैंडल क्लिक किए जाने पर आपको मेनू को दिखने से रोकना होगा। समाधान सरल है,

1) EditText क्लास बढ़ाएं,

2) ओवरराइड isSuggestionsEnabled() और false वापसी,

3) एक canPaste() विधि बनाएं और false वापसी करें। यह विधि छुपा रही है।

त्वरित समाधान

यदि आप इन सभी को मैन्युअल रूप से नहीं करना चाहते हैं यहां एक कस्टम संपादन टेस्ट क्लास है जिसे आप इसे जल्दी से पूरा करने के लिए उपयोग कर सकते हैं लेकिन मैं अभी भी सुझाव देता हूं कि एक बार ये कदम उठाने के लिए कि चीजें कैसे काम करेंगी।

public class MenuHidingEditText extends EditText {
    private final Context mContext;

    public MenuHidingEditText(Context context) {
        super(context);
        this.mContext = context;

        blockContextMenu();
    }

    public MenuHidingEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;

        blockContextMenu();
    }

    public MenuHidingEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.mContext = context;

        blockContextMenu();
    }

    private void blockContextMenu() {
        this.setCustomSelectionActionModeCallback(new BlockedActionModeCallback());
        this.setLongClickable(false);
        this.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                MenuHidingEditText.this.clearFocus();
                return false;
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            // setInsertionDisabled when user touches the view
            this.setInsertionDisabled();
        }
        return super.onTouchEvent(event);
    }

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

इसे इस्तेमाल करे

mEditText.setClickable(false);
mEditText.setEnabled(false);

अद्यतन करें

इस समाधान की कोशिश करो,

import android.content.Context;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

public class NoMenuEditText extends EditText
{
private final Context context;

/** 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
 */
boolean canPaste()
{
   return false;
}

/** 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
public boolean isSuggestionsEnabled()
{
    return false;
}

public NoMenuEditText(Context context)
{
    super(context);
    this.context = context;
    init();
}

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

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

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


/**
 * 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
{
    private final String TAG = NoMenuEditText.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) {}
}
}

संदर्भ: https://.com/a/28893714/5870896


मैंने EditText के लिए यह कोड बनाया है, और यह इस तरह के एक मुद्दे के लिए ठीक काम किया है

try {
    edtName.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            edtName.setSelection(0);
        }
    });
    edtName.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return true;
        }
    });
    edtName.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { return false; }
        @Override
        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { return false; }
        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { return false; }
        @Override
        public void onDestroyActionMode(ActionMode actionMode) { }
    });
} catch (Exception e) {
    e.printStackTrace();
}

mEditText.setLongClickable(false);

संपादित पाठ को अक्षम करने का इसका सबसे आसान तरीका है।





mongolian-vertical-script