অ্যাকশন বোতাম সহ একাধিক-লাইন সম্পাদনা


114

সেট EditTextসহ একটি উইজেট পাওয়া সম্ভব android:inputType="textMultiLine"এবং android:imeOptions="actionDone"একই সাথে?

আমি একটি বহু-লাইন সম্পাদনা বাক্স চাই যা কীবোর্ডের অ্যাকশন বোতামটি সম্পন্ন করা হবে, প্রবেশ (ক্যারিজ রিটার্ন) নয়, তবে এটি কাজ করছে বলে মনে হচ্ছে না ..

আগাম ধন্যবাদ


মাল্টিলাইন এডিটেক্সট এবং একটি বোতাম একসাথে মিলিয়ে একটি যৌগিক উইজেট চেষ্টা করার বিষয়ে কী?
সাবিন সেবাস্তিয়ান

উত্তর:


194

ব্যবহার

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

এবং এক্সএমএলে:

android:inputType="textMultiLine"

কীবোর্ডটি নীচে নেমে গেলে আমার জন্য কার্সারটি এখনও দেখাবে, আমাকে textField.setCursorVisible(false);একটি ভিতরে যুক্ত করতে হবেonEditorActionListener
ফোনিক্স

4.2.2 এবং 7.1.1 এ কাজ করে। ধন্যবাদ।
tehcpu

1
খুব ভাল কাজ করে ... আমি এটি খুঁজে পেতে সংগ্রাম করেছি। এই উত্তরটি সেরা উত্তর হিসাবে চিহ্নিত করা উচিত
এমএফএল

7
কেন এটি সমস্ত এক্সএমএল সেট আপ করার বিপরীতে কাজ করে?
অ্যান্ড্রু স্টেইনমেটজ

1
এই তথ্যটি খুঁজে পেতে লড়াই চালিয়ে যান। এটি এখনও মনোমুগ্ধকর মতো কাজ করছে!
কস্টিন

51

অ্যান্ড্রয়েড ডকুমেন্টেশন থেকে: ' "টেক্সটমલ્ટিয়ালাইন" সাধারণ পাঠ্য কীবোর্ড যা ব্যবহারকারীদের লাইন ব্রেক (ক্যারিজের রিটার্ন) অন্তর্ভুক্ত এমন দীর্ঘ স্ট্রিংগুলিকে ইনপুট করতে দেয় । 'অতএব আপনি কী-বোর্ডে' সম্পন্ন 'বোতামটি রাখতে চাইলে পাঠ্য মাল্টলাইনলাইন বৈশিষ্ট্যটি উপযুক্ত নয়।

সম্পন্ন বোতামটি সহ একাধিক-লাইন (এই ক্ষেত্রে 3 লাইন) ইনপুট ক্ষেত্র পাওয়ার একটি সহজ উপায় হ'ল সম্পাদনা

android:lines="3" 
android:scrollHorizontally="false" 

তবে কোনও কারণে এটি কেবলমাত্র আমার জন্য কাজ করে যদি আমি লেআউট ফাইলের পরিবর্তে কোডটিতে এই সেটিংসগুলি করি (অনক্রিটে)

TextView tv = (TextView)findViewById(R.id.editText);
if (tv != null) {
    tv.setHorizontallyScrolling(false);
    tv.setLines(3);
}

আমি আশা করি এটি কাউকে সহায়তা করে, কারণ এটি বের করতে বেশ কিছুটা সময় লেগেছে। আপনি যদি ম্যানিফেস্ট থেকে এটি কাজ করার কোনও উপায় খুঁজে পান তবে দয়া করে আমাদের জানান।


4
আপনি যদি এর উচ্চতা পরিবর্তন এড়াতে চান তবে maxLines()তার পরিবর্তে চেষ্টা করার পরামর্শও আমি দেবsetLines()EditText
ড্যানিয়েল স্মিথ

আমি মনে করি যে প্রশ্নে এটি স্পষ্ট করা হয়নি যে আপনার অ্যান্ড্রয়েড সেট করা উচিত: অ্যাকশনসেন্ডের মতো মান সহ imeOptions। এই উত্তরটি সম্পূর্ণ করে, আমাকে অ্যান্ড্রয়েড সেট করতে হয়েছিল: সিঙ্গললাইন = "সত্য" এমনকি যদি সেটম্যাক্সলাইনস ধরণের কোড দ্বারা এটি ওভাররাইট করে (এটি না করা আপনাকে উদাহরণস্বরূপ "প্রেরণ" দিয়ে কোনও প্রবেশ কী দেয় না)। <প্রবেশ করান> কর্ম ক্যাপচার করার জন্য, থেকে প্রথম উত্তর চেক stackoverflow.com/questions/5014219/... বাইরে।
ডিএনএক্স

দুঃখিত, শ্রেষ্ঠ বিকল্প আমি ক্যাপচার <প্রবেশ করান> সম্পর্কে পাওয়া উত্তর @earlcasper এখানে stackoverflow.com/questions/1489852/...
DNax

1
এটি আমার জন্য নিখুঁতভাবে কাজ করেছে (ব্যবহার করে setMaxLines(3)) অনেক অনেক ধন্যবাদ!
লরেন্স

1
একটি যাদুমন্ত্র মত কাজ: শুধু অ্যান্ড্রয়েড যোগ করুন: imeOptions = "actionDone" Android: ইনপুট = ভাল এবং অপসারণ যেমন অ্যান্ড্রয়েড আপনার XML থেকে "টেক্সট": লাইন = "3" অ্যান্ড্রয়েড scrollHorizontally = "FALSE" XML থেকে
HannahCarney

24

কাজের উদাহরণ! নীচের কাস্টম এডিটেক্সট ক্লাস তৈরি করুন যা এই বৈশিষ্ট্যটিকে সমর্থন করে এবং এক্সএমএল ফাইলে ক্লাসটি ব্যবহার করে। কাজের কোড:

package com.example;

import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;

public class ActionEditText extends EditText
{
   public ActionEditText(Context context)
   {
       super(context);
   }

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

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

   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs)
   {
       InputConnection conn = super.onCreateInputConnection(outAttrs);
       outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
       return conn;
   }
}

<com.example.ActionEditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:imeOptions="actionDone"
       android:inputType="textAutoCorrect|textCapSentences|textMultiLine" />

এটি আমার জন্য কাজ করেছে আমার প্রয়োজনটি একটি সম্পাদনা পাঠ্য তৈরি করা উচিত যা মাল্টি লাইন হওয়া উচিত পাশাপাশি নরম কীগুলিতে পরবর্তী বোতাম থাকা উচিত ............... তাই আমি যা করেছি তা অনেক ধন্যবাদ আমি পাঠ্য সম্পাদনাতে ছিলাম 2 টি লাইন অ্যান্ড্রয়েড যুক্ত করেছি: ইনপুটটাইপ = "টেক্সটমুটিলাইন" অ্যান্ড্রয়েড: imeOptions = "অ্যাকশনেক্সট" এবং উপরের কাস্টম শ্রেণিতে আমি করেছি: ইনপুট সংযোগ = সুপার.অনক্রিটআইপুট সংযোগ (আউটআটারস); //outAttrs.imeOptions & = ~ EditorInfo.IME_FLAG_NO_ENTER_ACTION; আউটআটারস.ইমঅ্যাপশনস এবং = EditorInfo.IME_ACTION_NEXT; রিটার্ন কান
যশ

কাজ করে। Andorid 6.0.1 এ পরীক্ষিত।
অ্যামিগুয়েলস

9

কোটলিনে এটি করার জন্য (এবং বিকল্প হিসাবে অন্যান্য কনফিগারেশনগুলি প্রয়োগ করুন যেমন textCapSentencesআপনি এই এক্সটেনশন ফাংশনটি ব্যবহার করতে পারেন:

// To use this, do NOT set inputType on the EditText in the layout
fun EditText.setMultiLineCapSentencesAndDoneAction() {
    imeOptions = EditorInfo.IME_ACTION_DONE
    setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_TEXT_FLAG_MULTI_LINE)
}

ব্যবহার:

myEditText.setMultiLineCapSentencesAndDoneAction()

1
জুন 2019 হিসাবে কাজ করে! ধন্যবাদ :)
রোহান তেনেজা

আমার setRawInputTypeপরিবর্তে setInputType
চাবিটি

9

আমি মনে করি এটি আপনার জিনিস করার উপায়। থাকা android:inputType="textMultiLine", android:imeOptions="actionDone"কী কার্যকারিতাটি অস্পষ্ট করে তোলে। আপনি মনে রাখতে পারেন যে আপনি ব্যবহার করতে পারেন android:lines="10"এবং সম্ভবত মুছে ফেলতে পারেন android:inputType="textMultiLine"তবে আপনি যা অর্জন করতে চান তা নির্ভর করে কখনও কখনও আপনার কেবল প্রয়োজন হয় android:inputType="textMultiLine"এবং এর কোনও প্রতিস্থাপন নেই।

EditText ed=new EditText(this);
ed.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if(keyCode == KeyEvent.KEYCODE_ENTER){
                //do your stuff here
            }
            return false;
        }
});

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

আমি কী-কোড # 66 অক্ষম করতে চাই এটি কি সম্ভব? আমি এটা কিভাবে করবো?
আদিল মালিক

1
কেন কোড কোড == 66 এর পরিবর্তে কী কোড == EditorInfo.IME_ACTION_GO?
tsell

5

এটি আমার পক্ষে নিখুঁতভাবে কাজ করে বলে মনে হচ্ছে

int lineNum = 2;
mEditText.setHorizontallyScrolling(false);
mEditText.setLines(3);

4

পুনঃব্যবহারযোগ্য কোটলিন সমাধান

এই মান নির্ধারণ কোডে শুধু আমার জন্য কাজ ছিল

edittext.inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
edittext.setHorizontallyScrolling(false)
edittext.maxLines = Integer.MAX_VALUE // Or your preferred fixed value

আমার ঘন ঘন এটি প্রয়োজন, তাই কোড পরিষ্কার রাখার জন্য এটি তৈরি করা হয়েছে:

fun EditText.multilineIme(action: Int) {
    imeOptions = action
    inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
    setHorizontallyScrolling(false)
    maxLines = Integer.MAX_VALUE
}

// Then just call
edittext.multilineIme(EditorInfo.IME_ACTION_DONE)

আপনি যদি 'সম্পন্ন' এ alচ্ছিক কাস্টম ক্রিয়া যুক্ত করতে চান তবে এটি চেষ্টা করুন:

fun EditText.multilineDone(callback: (() -> Unit)? = null) {
    val action = EditorInfo.IME_ACTION_DONE
    multilineIme(action)
    setOnEditorActionListener { _, actionId, _ ->
            if (action == actionId) {
                callback?.invoke()
                true
            }
            false
        }
    }
}

// Then you can call
edittext.multilineDone { closeKeyboard() }

// or just
edittext.multilineDone()

কলব্যাকে কিবোর্ডটি সহজেই নিয়ন্ত্রণ করতে হবে? এই পোস্টটি পড়ুন

তারপরে hideKeyboard()কল যুক্ত করুনEditText.multilineDone


1
Hisএই দুর্দান্ত উত্তর
মাইকেল

3

সংক্ষিপ্ত উত্তর: না, আমি বিশ্বাস করি এপিআই স্তর 11 (3.0) এর আগে এটি সম্ভব নয়।

এখানে একই সমস্যা ছড়িয়ে পড়েছে (গৃহীত উত্তরের মন্তব্যে আলোচনা করা হয়েছে):

অ্যান্ড্রয়েড সফট কীবোর্ড অ্যাকশন বোতাম

চূড়ান্ত মন্তব্য থেকে:

আমার ফোনে কয়েকটি অ্যাপ্লিকেশন দেখে, মাল্টলাইন বাক্সটি সর্বশেষে পাওয়া যায় বলে মনে হয়, এর নীচে একটি দৃশ্যমান "সম্পন্ন" বা "প্রেরণ" বোতামটি রয়েছে (যেমন ইমেল অ্যাপ্লিকেশন)।


3

এই পরিস্থিতিটি ঘিরে কাজ করার একটি সহজ উপায়:

  • এই বৈশিষ্ট্যগুলি এডিট টেক্সটে রাখুন:

    android:inputType="textMultiLine" 
    android:scrollHorizontally="false"
  • তারপরে কেবল ENTER টিপলে কীবোর্ডটি লুকানোর জন্য এই কোডটি যুক্ত করুন:

    editText.setOnEditorActionListener(new OnEditorActionListener() 
    {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) 
        {
            editText.setSelection(0);
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);      
            return true;
         } 
         else 
         {
            return false;
         }
         }
    });

2

যদি এটি অন-স্ক্রিন কীবোর্ডটির চেহারা সম্পর্কে না হয় তবে আপনি কিবোর্ডে একটি ইনপুট শ্রোতার সাথে সহজেই রাখতে পারেন এবং যদি ব্যবহারকারী কোনও নতুন লাইন প্রবেশ করান তবে "সম্পন্ন" -স্ট্যাটাসটি ফায়ার করতে পারেন।


2

আপনি যদি ইনপুট বিকল্প টেক্সট আইমেপশনগুলি ফ্ল্যাগনেেক্সট এবং অ্যাকশনেক্সট সহ ব্যবহার করেন তবে আপনি ক্যারিয়ার ফেরতের পরিবর্তে পরবর্তী বোতামটি পাবেন


2

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

আপনার জাভা কোডে:

////////////Code to Hide SoftKeyboard on Enter (DONE) Press///////////////
editText.setRawInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
editText.setImeActionLabel("DONE",EditorInfo.IME_ACTION_DONE);              //Set Return Carriage as "DONE"
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
    {
                if (event == null) {
                    if (actionId == EditorInfo.IME_ACTION_DONE) {
                        // Capture soft enters in a singleLine EditText that is the last EditText
                        // This one is useful for the new list case, when there are no existing ListItems
                        editText.clearFocus();
                        InputMethodManager inputMethodManager = (InputMethodManager)  getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
                        inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
                    }

                    else if (actionId == EditorInfo.IME_ACTION_NEXT) {
                        // Capture soft enters in other singleLine EditTexts
                    } else if (actionId == EditorInfo.IME_ACTION_GO) {
                    } else {
                        // Let the system handle all other null KeyEvents
                        return false;
                    }
                } 
        else if (actionId == EditorInfo.IME_NULL) {
                    // Capture most soft enters in multi-line EditTexts and all hard enters;
                    // They supply a zero actionId and a valid keyEvent rather than
                    // a non-zero actionId and a null event like the previous cases.
                    if (event.getAction() == KeyEvent.ACTION_DOWN) {
                        // We capture the event when the key is first pressed.
                    } else {
                        // We consume the event when the key is released.
                        return true;
                    }
                } 
        else {
                    // We let the system handle it when the listener is triggered by something that
                    // wasn't an enter.
                    return false;
                }
                return true;
        }
});




1

আমি ৪.x এ আছি এবং সেটহোরাইজেন্টালিস্ক্রোলিং () সেটলাইন () বা সেটম্যাকলাইনস () এর সাথে কল করার চেষ্টা করেছি, পাশাপাশি ডোন বোতামটি প্রদর্শনের জন্য অনেকগুলি এক্সএমএল কনফিগারেশন রয়েছে। তাদের কেউই কাজ করেননি। তল লাইনটি হ'ল যদি আপনার এডিটেক্সটটি মাল্টি-লাইন হয় তবে অ্যান্ড্রয়েড সর্বদা "সম্পন্ন" বোতামের পরিবর্তে ক্যারেজ রিটার্ন প্রদর্শন করতে চাইবে, যদি না আপনি এটিকে কিছু হ্যাক না করেন।

সর্বনিম্ন জটিলতার সমাধানটি আমি খুঁজে পেয়েছি যা গাড়ীর ফেরতের আচরণের পুনঃনির্মাণের সাথে জড়িত নয়: https://stackoverflow.com/a/12570003/3268329 । এই সমাধানটি অ্যান্ড্রয়েডের একাধিক-লাইন দর্শনগুলির জন্য IME_FLAG_NO_ENTER_ACTION পতাকাটি জোর করার নিরলস আকাঙ্ক্ষাকে বাতিল করে দেবে, যার ফলে ডোন বোতামটি অদৃশ্য হয়ে যায়।


0

আমি বেশ কিছু সময় ধরে পাশাপাশি লড়াই করেছি, তবে শেষ পর্যন্ত আমি একটি সমাধান খুঁজে পেয়েছি!

কেবল যেমন একটি কাস্টম সম্পাদনা পাঠ্য বর্গ তৈরি করুন:

public class EditTextImeMultiline extends EditText {

    public void init() {
        addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                for (int i = s.length(); i > 0; i--)
                    if (s.subSequence(i - 1, i).toString().equals("\n"))
                        s.replace(i - 1, i, "");
            }
        });
        setSingleLine();
        setHorizontallyScrolling(false);
        this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                EditTextImeMultiline.this.setLines(EditTextImeMultiline.this.getLineCount());
            }
        });
    }

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

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

    public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }
}

এই শ্রেণিটি লাইনব্রাইকগুলি সরিয়ে দেয় (remove n), পাঠ্যটি মাল্টলাইনলাইন হিসাবে পাঠ্যটিকে মোড়া করে দেয় এবং আপনাকে একটি আইএমএक्शन দ্বারা প্রবেশ বোতামটি প্রতিস্থাপন করতে দেয়;)।

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

এখানে যুক্তি ব্যাখ্যা করতে:

  • এন্টারটির পরিবর্তে আইমিএक्शन বোতামটি প্রদর্শন করতে সক্ষম হতে সম্পাদনা পাঠ্যকে সিঙ্গললাইন হিসাবে সেট করুন।
  • দেখার শেষে পৌঁছে যাওয়ার সময় পাঠ্যটিকে পরবর্তী লাইনে যেতে অনুভূমিক স্ক্রোলিংটি সরিয়ে ফেলুন।
  • OnGlobalLayoutListener এর সাহায্যে লেআউট পরিবর্তনগুলি দেখুন এবং এটি "লাইন" পরামিতিটি এডিট টেক্সট দ্বারা অনুষ্ঠিত বর্তমান পাঠ্যের "লাইনকাউন্ট" এ সেট করুন। এটিই এর উচ্চতা সতেজ করে তোলে।

0

কার্যনির্বাহী সমাধানটি এখানে, আপনার কাস্টম এডিটেক্সটভিউটি তৈরি করুন (কেবল একটি পাঠ্যদর্শন প্রসারিত করুন) এবং onplide onpliponconctionation আপনি একটি স্বীকৃত উত্তরের উত্তর খুঁজে পাবেন: ২.৩-তে সম্পন্ন সফটইনপুট অ্যাকশন লেবেলের সাথে একাধিক সম্পাদনা পাঠ

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