অ্যান্ড্রয়েডে নিষ্ক্রিয় ইনপুট সংযোগের বিষয়ে সতর্কতা পান


127

আমি আমার লগকটে নিম্নলিখিত সতর্কতাটি পেয়েছি।

getExtractedText on inactive InputConnection

আমি এর পিছনে কারণ খুঁজে পেতে অক্ষম। সাহায্য করুন


4
আমি বুঝতে পারি না এই প্রশ্নে অস্পষ্ট / অস্পষ্ট / অসম্পূর্ণ কি? আমার অ্যাপ্লিকেশন চালানোর সময় আমি আমার লগকটে এই সতর্কতাটি পেয়েছি, আমি এই সতর্কতার কারণ জানতে চাই।
পঙ্কজগরওয়াল

2
আমি আমার অ্যাপ্লিকেশনটিতে এটিও বানাচ্ছি যা আমি বিকাশ করছি এবং কোথা থেকে এসেছে তা আমার কোনও ধারণা নেই। যদি কেউ কখনও জানতে পারেন, একটি মন্তব্য পোস্ট করুন। এটি আসলে "getExtectedText" এর পরে অন্যান্য অনেকগুলি সতর্কতা দেখায়। আমি আরও দেখতে পাই: "আর্টব্যাচএডিট", "এন্ডব্যাচএডিট", "গেটটেক্সটব্যাকারফ্রান্সকার" এবং আরও অনেক কিছু।
বিঘত

1
মডারেটররা কি এই প্রশ্নের এক নজর রাখছেন? যদি না হয় তবে তাদের উচিত কারণ তারা 14 টি উর্ধ্বে থাকার পরেও যদি এই প্রশ্নটিকে অস্পষ্ট ও অবিশ্বাস্য বলে বিশ্বাস করে তবে আমি কী বলব তা আমি জানি না
পঙ্কজগরওয়াল

আমি একমত, এই সমস্যাটিও আমার সমাধান করা দরকার। কারণ সম্পর্কে আমার ধারণা নেই।
জোনউইলিস

3
আপনার কী কোড রয়েছে যা এই ত্রুটি ঘটাচ্ছে?
বিল

উত্তর:


44

আমি একটি অনুরূপ ইস্যু মধ্যে দৌড়ে। আমার লগক্যাট:

W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextAfterCursor on inactive InputConnection
...
I/Choreographer(20010): Skipped 30 frames!  The application may be doing too much work on its main thread.

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

উদা:

editText.setText(null);

উপরের আমার লোগকটের শেষ লাইনটি ঘটছে তার দুর্দান্ত ইঙ্গিত দেয়। নিশ্চিতভাবেই, ইনপুট সংযোগটি পাঠ্যটি সাফ করার অনুরোধ দ্বারা অভিভূত হয়েছে। আমি কোডটি সাফ করার চেষ্টা করার আগে পাঠ্য দৈর্ঘ্যের জন্য যাচাই করার জন্য কোডটি সংশোধন করার চেষ্টা করেছি:

if (editText.length() > 0) {
    editText.setText(null);
}

এই সমস্যাটি প্রশমিত করতে সাহায্য করে যে বোতামটি টিপুন দ্রুত চাপ দেওয়ার ফলে আর আইএনপুট সংযোগের সংঘটিত সতর্কতাগুলির প্রবাহের কারণ হয় না। তবে এটি এখনও সমস্যার ঝুঁকির মধ্যে রয়েছে যখন ব্যবহারকারী কোনও অ্যাপ্লিকেশন পর্যাপ্ত লোডের মধ্যে থাকা অবস্থায় কোনও কিছু টাইপ করতে এবং বোতাম টিপতে বা বোতাম টিপানোর মধ্যে দ্রুত পরিবর্তন করে etc.

ভাগ্যক্রমে, আমি পাঠ্যটি সাফ করার জন্য আরও একটি উপায় খুঁজে পেয়েছি: সম্পাদনাযোগ্য ক্লেয়ার () । এটি দিয়ে আমি কোনও হুঁশিয়ারি পাই না:

if (editText.length() > 0) {
    editText.getText().clear();
}

নোট করুন যে আপনি সমস্ত ইনপুট স্থিতি পরিষ্কার করতে চান এবং কেবল পাঠ্য নয় (অটোটেক্সট, অটোক্যাপ, মাল্টিট্যাপ, পূর্বাবস্থায়), আপনি TextKeyListener.clear (সম্পাদনযোগ্য ই) ব্যবহার করতে পারেন ।

if (editText.length() > 0) {
    TextKeyListener.clear(editText.getText());
}

1
আমি IInputConnectionWrapper সতর্কতাও পেয়ে যাচ্ছিলাম এবং আমার অ্যাপ্লিকেশন প্রায় এএনআর পেয়েছে, পদ্ধতি পরিষ্কার () আমার পক্ষে কাজ করেছে ... সুপার অদ্ভুত বাগ, আমি সেটটেক্সট ("") সেট করার আগে;
বক্স

17

হালনাগাদ:

আমি ইনপুট সংযোগের সতর্কতাগুলি পাওয়ার কারণটি আমি যেখানে পাঠ্যটি সেট করছিলাম তা নয় (যেমন, onTextChangedকলব্যাকে বা afterTextChanged)) - কারণ এটি আমি ব্যবহার করছিলাম setText

ফোন করে আমি বিষয়টিটি পেয়েছি:

hiddenKeyboardText.getText().clear();
hiddenKeyboardText.append("some string");

দ্রষ্টব্য: আমি afterTextChangedকলব্যাকটিতে কলটি এখনও করছি , যদিও এটি কোনও সতর্কতা ছাড়াই কাজ করে ontextChanged

পূর্ববর্তী উত্তর:

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

উপরের জনসনের সমাধান অনুসারে স্পষ্ট পাঠ্যের অংশটি কাজ করে। তবে পাঠ্যটি পুনরায় সেট করা সমস্যাযুক্ত ছিল এবং আমি ইনপুট সংযোগের সতর্কতা পেয়েছি।

প্রথমদিকে, আমার onTextChanged(CharSequence s, ...)নিম্নরূপ হিসাবে সংজ্ঞা দেওয়া হয়েছিল:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (isResettingKeyboard)
        return;

    // ... do what needs to be done

    resetKeyboardString();

}

public void resetKeyboardString()
{
    isResettingKeyboard = true;

    hiddenKeyboardText.getText().clear();
    hiddenKeyboardText.setText(keyboardInitString);
    hiddenKeyboardText.setSelection(defaultKeyboardCursorLocation);

    isResettingKeyboard = false;
}

যখন onTextChanged(...)ডাকা হয়, সম্পাদনা পাঠটি কেবল পঠন মোডে থাকে। আমি নিশ্চিত নই যে এর অর্থ আমরা যদি কল getText.clear()করার চেয়ে বেশি কিছু করতে না পারি ( setText(...)কলগুলি ইনপুট সংযোগের সতর্কতাও উত্পন্ন করে)।

যাইহোক, কলব্যাকটি afterTextChanged(Editable s)পাঠ্য সেট করার জন্য সঠিক জায়গা।

@Override
public void afterTextChanged(Editable s) {

    if (isResettingKeyboard)
        return;

    resetKeyboardString();

    // ... 
}

এটি এখন পর্যন্ত, কোনও সতর্কতা ছাড়াই কাজ করছে।


আমি খুব একই সমস্যা। আমি যেটা বুঝতে পেরেছিলাম তা হল যে আপনার সমাধানটি ইনপুট সংযোগের সতর্কতাগুলি অদৃশ্য করে দিলেও আমি লক্ষ্য করেছি যে সেই afterTextChangedপদ্ধতিটি hiddenKeyboardText.getText().clear();পাশাপাশি চালু করা হয়েছে hiddenKeyboardText.append("some string");এবং এই ঘটনাটিও বিবেচনায় নেওয়া উচিত। আমার কাছ থেকে +1!
নিক

@ নিক সত্য সত্য - if (isResettingKeyboard) return;শীর্ষে থাকা নিশ্চিত করা গুরুত্বপূর্ণ ...
আহস

7

সহায়তা নথি থেকে

http://developer.android.com/reference/android/view/inputmethod/InputConnection.html

ইনপুট সংযোগ ইন্টারফেসটি একটি ইনপুটমেথড থেকে অ্যাপ্লিকেশনটিতে ফিরে আসে যা এর ইনপুট গ্রহণ করে channel এটি কার্সারের চারপাশে পাঠ্য পাঠ করা, পাঠ্য বাক্সে পাঠ্য প্রতিশ্রুতিবদ্ধ করা এবং অ্যাপ্লিকেশনটিতে কাঁচা কী ইভেন্টগুলি প্রেরণ করা যেমন ব্যবহার করা হয়।

এছাড়াও, আরও পঠন শো

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

এটি এ জাতীয় পাঠ্যের পরিবর্তনগুলি এবং সতর্কতা পরিবর্তনের উপর নজর রাখে to

ইস্যুটি নীচে নেওয়ার জন্য আপনাকে যে কোনও ডাটাবেস ক্যোয়ারী তৈরি করতে হবে, সম্ভবত লেআউটভিউ বা বিন্যাসে তালিকাগুলির আশেপাশে।

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

এছাড়াও, সমস্যাটি কি আপনার অ্যাপ থেকে উত্থাপিত হয়? বা সম্ভবত আপনি সম্প্রতি ইনস্টল করা অন্য কারও। সম্পূর্ণ লগগেটের ট্রেস তালিকাভুক্ত করুন। কেউ হয়ত বিষয়টি চিনতে পারে।

আমি একটি অনুমানকে ঝুঁকিতে ফেলব যে আপনি যদি এর চারপাশে সুনির্দিষ্ট কিছু না লিখে থাকেন তবে এটির কোনও লোকের লগ বার্তা, অথবা সম্ভবত আপনার ব্যবহারের কোনও লাইব্রেরি?


1
ধন্যবাদ, আমি ডিবি কোয়েরি করি তবে আশ্চর্যের বিষয় এমুলেটরটিতে অ্যাপটি চালানোর সময় এই সতর্কতাটি দেখা যায় না, সুতরাং এটি সম্ভবত আমার ডিভাইসে থাকা অন্য কোনও অ্যাপ্লিকেশনটির কারণ হতে পারে। এই দিকটি
খতিয়ে দেখবে

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

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

7

আমি একই সমস্যা ছিল। আমার EditTextsএবং ক্রিয়াকলাপটি ফোকাস হারিয়ে ফেললে নরম কীবোর্ড সক্রিয় হওয়ার পরে সতর্কতাটি উপস্থিত হয়েছিল ।

আমি যা করেছি তা হ'ল অনপজ () -র কীবোর্ডটি লুকানো;

@Override
protected void onPause() {

    // hide the keyboard in order to avoid getTextBeforeCursor on inactive InputConnection
    InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    inputMethodManager.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

    super.onPause();
}

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

1

এই সমস্যাটি আমার জন্য সমাধান করুন সম্ভবত আপনারও একই সমস্যা রয়েছে।

এটি একটি সৃষ্টি হয়েছিল অবজেক্ট মধ্যে HeaderView এর তালিকা অ্যাডাপ্টার

আমি একটি স্ফীত দেখুন এবং ঘোষিত অবজেক্ট এবং করা TextWatcher এটিতে।

View v = LayoutInflater.from(CONTEXT).inflate(R.layout.in_overscrollview, null);
Object= (Object) v.findViewById(R.id.OBJECT_ID);

Object.addTextChangedListener(new TextWatcher() {
        @Override
        public void afterTextChanged(Editable s) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after){
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        //Do my work
        //Update my view
        }
});

এটিকে তালিকার অ্যাডাপ্টারে যুক্ত করে অ্যাডাপ্টারটি তৈরি করে।

JobListView = (ListView) getListView().findViewWithTag("JOBLISTVIEWTAG");
JobListView.addHeaderView(v, null, false);
JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, ITEMS_FOR_ADATER);
ListView.setAdapter(JOBSadapter);

পাঠ্য প্রহরী কাজ করে সবকিছু ঠিক আছে ।

কিন্তু যদি আমি কখনো প্রাথমিক বিল্ড পর অ্যাডাপ্টারের পুনর্নির্মিত।

JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, DIFFERENT_ITEMS_FOR_ADAPTER);
ListView.setAdapter(JOBSadapter);

যে HeaderView খুব পুনর্নির্মিত হয়।

এই সতর্কতাটি প্রদর্শন করবে কারণ অবজেক্টটি সরানো হয়েছিল এবং পাঠ্য প্রহরীটি এখনও এটির জন্য নজর রাখছিল।

তালিকা অ্যাডাপ্টার এবং অবজেক্ট প্রতিস্থাপিত হয়েছে, এবং আমি অনুমান করছি টেক্সট প্রহরী যখন এটা ঘটেছে অন্যান্য উপায় খুঁজছিলাম।

তাই সতর্কতা যায় বন্ধ এবং দৈবক্রমে টেক্সট প্রহরী খুঁজে বের করে HeaderView এবং অবজেক্ট । তবে এটি ফোকাস হারিয়ে ফেলে এবং সেই সতর্কতা লগ করে।

ব্যবহার

JOBSadapter.notifyDataSetChanged();

সমস্যাটি স্থির করল।

কিন্তু যদি আপনি একটি আছে অবজেক্ট ভিতরে অ্যাডাপ্টার , এবং টেক্সট প্রহরী সংযুক্ত বস্তু ভিতরে অ্যাডাপ্টার । তাহলে আপনার আরও কিছু কাজ করার প্রয়োজন হতে পারে।

শ্রোতাদের সরানোর চেষ্টা করুন এবং আপনি যে কাজ করছেন তা করার পরে এটিকে আবার সংযুক্ত করুন।

Object.removeTextChangedListener();

অথবা

Object.addTextChangedListener(null);

1

অ্যান্টনিওমের উত্তর ছাড়াও, নিশ্চিত হয়ে নিন যে আর কোনও ক্রিয়াকলাপ করা দরকার ছিল, সত্যিই কি-বোর্ডটি আড়াল করার পরে সম্পন্ন করা হয়েছে, সুতরাং যদি আপনি নীচের মত কীবোর্ডটি লুকিয়ে রাখেন:

public void hideKeyboard() {
InputMethodManager inputMethodManager =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}

, কীবোর্ডটি লুকানোর পরে আপনার সফল ক্রিয়াগুলি সম্পাদন করা দরকার:

getWindow().getDecorView().post(new Runnable() {            
        @Override
        public void run() {
            finish(); //Sample succeeding code
     }
});

0

আমাকে এডিট টেক্সট থেকে পাঠ্য সংশোধন করতে বা পাঠানোর সময় আমার এই সমস্যা হয়েছিল এবং এটি ফোকাস করা হয়েছিল।

সুতরাং এটি পরিবর্তন করুন বা এগুলি পাওয়ার আগে আমি কীবোর্ডটি বন্ধ করে দিয়েছি এবং এটি ঠিক করেছি।

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

হতে পারে, আপনার সমস্যাটি ভিন্ন।


0

আমি এই জাতীয় xML এ একটি ইনপুট প্রকার tingোকানোর ক্ষেত্রে আমার সমস্যার সমাধান করেছি: অ্যান্ড্রয়েড: ইনপুট টাইপ = "কিছুই নয় | পাঠ্য | পাঠ্যক্যাপওয়ার্ডস | টেক্সটরি"

এর আগে অ্যান্ড্রয়েড ছিল: ইনপুটটাইপ = "পাঠ্য" এটি আমার সমস্যার সমাধান করে।


3
আমার জন্য কিছুই করেনি।
DSlomer64

0

লগকাটে ত্রুটি: নিষ্ক্রিয় ইনপুট সংযোগে getTextBeforeCursor

সমাধান: আপনার ইনপুট কীবোর্ডটি লুকান এবং অ্যাপ্লিকেশনটি চালান।


0

সম্পাদনা পাঠ্য সাফ করার আগে সফ্টওয়্যার কীবোর্ডটি লুকান - সতর্কতা দেখানো হবে না।

এছাড়াও, এটি ডিভাইস নির্দিষ্ট বলে মনে হচ্ছে । আমি এটি কেবলমাত্র Nexus 4 (Android 7.1) এ দেখেছি। অনুকরণকারী (8.0, 7.1) বা নেক্সাস 5 এর বিষয়ে কোনও সতর্কতা নেই।


0

আমার সমস্যা দৃশ্যমানতা সেটিং দ্বারা সৃষ্টি হয়েছিল EditTextকরার GONEঅবিলম্বে এবং তারপর থেকে এটি সেটিং VISIBLEপ্রতিটি সময় ব্যবহারকারী একটি অক্ষর টাইপ করা, আমি প্রতিটি সময় পাঠ্য পরিবর্তন এবং কিছু কিছু ক্ষেত্রে দৃশ্য আড়াল করা প্রয়োজন ইনপুটের বৈধতা দৌড়াচ্ছিলাম।

সমাধানটি হ'ল ইউআই বা রাষ্ট্রীয় আপডেটগুলির মধ্যে GONE এ ভিউ বা লেআউটের দৃশ্যমানতা সেট করা এড়ানো, কারণ এতে EditTextফোকাসটি হারাতে পারে


0

যদি একই সমস্যা হয় তবে আমার রাষ্ট্রবিহীন উইজেটটিকে স্টেটফুল উইজেটে রূপান্তর করে এটি ঠিক করুন আপনি এটি চেষ্টা করতে পারেন

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