অ্যান্ড্রয়েড ডিভাইসে সফ্টওয়্যার কীবোর্ড দৃশ্যমান আছে কিনা তা আমি কীভাবে সনাক্ত করব?


249

অ্যান্ড্রয়েডে সফ্টওয়্যার (ওরফে "সফট") কীবোর্ডটি স্ক্রিনে দৃশ্যমান কিনা তা সনাক্ত করার কোনও উপায় আছে?



1
নির্দিষ্ট ক্ষেত্রে এটির কী সমাধান হতে পারে (যদি কোনও তৃতীয় পক্ষের কীবোর্ড ইনস্টল থাকে) বিশ্বব্যাপী বিজ্ঞপ্তিগুলি যাচাই করা হয় যখন একটি কীবোর্ড খোলা থাকে সেখানে একটি সিস্টেম নোটিফিকেশন রয়েছে যা "কিবোর্ড পরিবর্তন করুন" বলে উল্লেখ করে - একটি নোটিফিকেশনলিস্টার সার্ভিস
প্রফেসর

2
প্রায় 8 বছর এবং তারপরেও কোনও কঠিন সমাধান নেই, ওহ তারা যদি একটির পরিচয় দেয় তবে এটি এপিআই> 30 এর হয়ে উঠবে যাইহোক কিছু মনে করবেন না ...
এমকাজেম আখগারি

উত্তর:


71

সরাসরি কোনও উপায় নেই - দেখুন http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a যেখানে অ্যান্ড্রয়েড দল থেকে ডায়ান হ্যাকবোন প্রতিক্রিয়া জানিয়েছে। যাইহোক, উইন্ডোর আকার # অনমিজরে পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে আপনি এটি পরোক্ষভাবে সনাক্ত করতে পারেন। দেখুন অ্যানড্রইড সফ্টওয়্যার কীবোর্ড দৃশ্যমানতা চেক করতে কিভাবে?


276

এটি আমার পক্ষে কাজ করে। সম্ভবত এটি সর্বদা সমস্ত সংস্করণের জন্য সেরা উপায় ।

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

boolean isKeyboardShowing = false;
void onKeyboardVisibilityChanged(boolean opened) {
    print("keyboard " + opened);
}

// ContentView is the root view of the layout of this activity/fragment    
contentView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {

        Rect r = new Rect();
        contentView.getWindowVisibleDisplayFrame(r);
        int screenHeight = contentView.getRootView().getHeight();

        // r.bottom is the position above soft keypad or device button.
        // if keypad is shown, the r.bottom is smaller than that before.
        int keypadHeight = screenHeight - r.bottom;

        Log.d(TAG, "keypadHeight = " + keypadHeight);

        if (keypadHeight > screenHeight * 0.15) { // 0.15 ratio is perhaps enough to determine keypad height.
            // keyboard is opened
            if (!isKeyboardShowing) {
                isKeyboardShowing = true
                onKeyboardVisibilityChanged(true)
            }
        }
        else {
            // keyboard is closed
            if (isKeyboardShowing) {
                isKeyboardShowing = false
                onKeyboardVisibilityChanged(false)
            }
        }
    }
});

3
এখানে একটি কার্যকরী বক্তব্য
ফারুক টপটাস

1
এটিকে একটি ইউটিস ক্লাসে রাখুন এবং ক্রিয়াকলাপে পাস করুন - পুরো অ্যাপ্লিকেশনটিতে এখন দরকারী।
জাস্টিন

2
এবং কোথায় contentViewঘোষিত হয়?
কোড-শিক্ষানবিস

1
@ কোড-শিক্ষানবিস ক্রিয়াকলাপ / খণ্ডে আপনি নরম কীবোর্ড পরিবর্তনগুলিতে সাড়া দিতে খুঁজছেন। কন্টেন্টভিউ এই ক্রিয়াকলাপ / খণ্ডের বিন্যাসের মূল দৃশ্য।
এয়ারওয়ে

1
অ্যান্ড্রয়েড 6 এবং 7 এ আমার জন্য কাজ করেছেন
ভি.মার্ক 16'18

71

এটা চেষ্টা কর:

InputMethodManager imm = (InputMethodManager) getActivity()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    if (imm.isAcceptingText()) {
        writeToLog("Software Keyboard was shown");
    } else {
        writeToLog("Software Keyboard was not shown");
    }

9
এটি আমার পক্ষে কাজ করে না। কীবোর্ডটি প্রদর্শিত শাখা এমনকি ট্রিগার শুরু করে এমনকি যখন কীবোর্ডটি কখনই প্রদর্শিত হয় না বা প্রদর্শিত না হয় এবং তারপরে বন্ধ করা হয়।
পিটার আজতাই

30
এটা সবসময় সত্য ফিরে।
শিবাং ত্রিবেদী

1
হ্যাঁ, এটি সর্বদা সত্য ফিরে আসে।
লিয়ন পেলেটিয়ার

ভুল। এটি সর্বদা সত্য ফিরে আসে
গৌরব অরোরা

178
এটি মর্মান্তিক যে অ্যান্ড্রয়েড কাঠামোর অভাব, এবং আরও খারাপ, এক্ষেত্রে অসঙ্গতিপূর্ণ । এটি অতি সহজ হতে হবে।
ভিকি চিজওয়ানি

57

আমি একটি সাধারণ ক্লাস তৈরি করেছি যা এর জন্য ব্যবহার করা যেতে পারে: https://github.com/ravindu1024/android-keyboardlistener । এটি কেবল আপনার প্রকল্পে অনুলিপি করুন এবং নীচে ব্যবহার করুন:

KeyboardUtils.addKeyboardToggleListener(this, new KeyboardUtils.SoftKeyboardToggleListener()
{
    @Override
    public void onToggleSoftKeyboard(boolean isVisible)
    {
        Log.d("keyboard", "keyboard visible: "+isVisible);
    }
});

কোড exaclty যেখানে আমি এটি করা আছে? আমি এটিকে কোনও ক্রিয়াকলাপে রেখেছি, তবে এটি কোনও কীবোর্ড উপস্থিতি বা অদৃশ্য হওয়া সনাক্ত করে না।
টুম টু

ঠিক আছে, আপনি আপনার ক্রিয়াকলাপের ভিতরে এটি যে কোনও জায়গায় রাখতে পারেন। সেট-কনটেন্টভিউ () কল করার পরে কেবল এটিআরকেট () পদ্ধতিতে রেখে দিন এবং আপনার কলব্যাক হওয়া উচিত। বিটিডব্লিউ, আপনি কোন ডিভাইসটি ব্যবহার করে দেখছেন?
ravindu1024

@ মৌলিকডোডিয়া আমি যাচাই করেছি এবং এটি টুকরো টুকরো করে কাজ করে। এটি এটির মতো সেট আপ করুন: কীবোর্ডUtils.addKeyboardToggleListener (getActivity (), এটি); এবং এটি কাজ করা উচিত। আপনি কোন ডিভাইসে এটি চেষ্টা করছেন?
ravindu1024

আমি মোটো-জি 3 ডিভাইসে চেষ্টা করছি @ @ ravindu1024
মৌলিক

এই স্নিপেটের জন্য ধন্যবাদ, আমার একটি প্রশ্ন আছে যে শ্রোতাদের অপসারণের জন্য এই কোডটি প্রয়োজনীয়?
প্রতীক বুটানি

28

খুব সহজ

1. আপনার মূল দর্শন আইডি রাখুন

rootViewএক্ষেত্রে আমার মূল দৃষ্টিভঙ্গির দিকে ইঙ্গিত করে এমন একটি দৃশ্য relative layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/addresses_confirm_root_view"
                android:background="@color/WHITE_CLR">

2. আপনার ক্রিয়াকলাপে আপনার মূল দৃষ্টিভঙ্গি শুরু করুন:

RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);

৩. কীবোর্ডটি চালু বা বন্ধ করে কিনা তা সনাক্ত করুন getViewTreeObserver()

    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightDiff = rootView.getRootView().getHeight() - rootView.getHeight();

                if (heightDiff > 100) { 
                    Log.e("MyActivity", "keyboard opened");
                } else { 
                    Log.e("MyActivity", "keyboard closed");
                }
            }
        });

15
ওহে সাথী, আপনি আমাকে বলতে পারেন এই ম্যাজিক 100 কোথা থেকে এসেছে? 101 বা 99 নয় কেন? ধন্যবাদ
করলি

@ কারোলি আমার ধারণা এটি হতে পারে এবং 1। কোনো ব্যাপার না. কেবলমাত্র এটি অবশ্যই কীবোর্ডের আসল দৈর্ঘ্যের চেয়ে কম হতে হবে
ভ্লাদ

@ কারোলি মূলত, তিনি আপনার ক্রিয়াকলাপের মূল দেখার আকারের সাথে উইন্ডোর আকারের তুলনা করছেন। নরম কীবোর্ডের উপস্থিতি মূল উইন্ডোর আকারকে প্রভাবিত করে না। সুতরাং আপনি এখনও 100 এর মান
কমাতে পারেন

ম্যাজিক নম্বরটি অন্যান্য জিনিসের সাথে আপনার শীর্ষবারের বিন্যাসের উপর নির্ভর করে। সুতরাং এটি আপনার অ্যাপের সাথে সম্পর্কিত। আমি আমার একটিতে 400 ব্যবহার করেছি।
মর্টেন হল্মগার্ড

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

8

আমি এটিকে ভিত্তি হিসাবে ব্যবহার করেছি: http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android

/**
* To capture the result of IMM hide/show soft keyboard
*/
public class IMMResult extends ResultReceiver {
     public int result = -1;
     public IMMResult() {
         super(null);
}

@Override 
public void onReceiveResult(int r, Bundle data) {
    result = r;
}

// poll result value for up to 500 milliseconds
public int getResult() {
    try {
        int sleep = 0;
        while (result == -1 && sleep < 500) {
            Thread.sleep(100);
            sleep += 100;
        }
    } catch (InterruptedException e) {
        Log.e("IMMResult", e.getMessage());
    }
    return result;
}
}

তারপরে এই পদ্ধতিটি লিখেছেন:

public boolean isSoftKeyboardShown(InputMethodManager imm, View v) {

    IMMResult result = new IMMResult();
    int res;

    imm.showSoftInput(v, 0, result);

    // if keyboard doesn't change, handle the keypress
    res = result.getResult();
    if (res == InputMethodManager.RESULT_UNCHANGED_SHOWN ||
            res == InputMethodManager.RESULT_UNCHANGED_HIDDEN) {

        return true;
    }
    else
        return false;

}

এরপরে আপনি এটি সফ্টকিবোর্ড খোলার সমস্ত ক্ষেত্র (সম্পাদনা পাঠ্য, স্বতঃসম্পূর্ণ টেক্সটভিউ, ইত্যাদি) পরীক্ষা করতে এটি ব্যবহার করতে পারেন:

    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    if(isSoftKeyboardShown(imm, editText1) | isSoftKeyboardShown(imm, autocompletetextview1))
        //close the softkeyboard
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

সংক্ষেপে কোনও আদর্শ সমাধান নয়, তবে এটি কাজটি করে।


2
এইটা কাজ করে. আপনি বাস্তবায়ন যেন singelton আপনি ফোকাস পরিবর্তনের উপর সব edittexts ক্ষেত্রে প্রযোজ্য এবং এক বিশ্বব্যাপী কীবোর্ড শ্রোতা থাকতে পারে
Rarw

@ ডিটারম গেটঅ্যাক্টিভিটি () টুকরোগুলির জন্য নির্দিষ্ট, এর পরিবর্তে আপনারঅ্যাক্টিভিটিনেম.এটি চেষ্টা করুন। আরও দেখুন: স্ট্যাকওভারফ্লো.com
ক্রিস্টোফার হ্যাকেল


6

আপনি এই উত্তরটি উল্লেখ করতে পারেন - https://stackoverflow.com/a/24105062/3629912

এটি আমার জন্য প্রতিটি সময় কাজ করে।

adb shell dumpsys window InputMethod | grep "mHasSurface"

এটি সত্য হবে, যদি সফ্টওয়্যার কীবোর্ড দৃশ্যমান হয়।


10
এটি কেবল বিকাশের সময় কার্যকর - কোনও অ্যাপ্লিকেশনটিতে ব্যবহারের জন্য কোনও সমাধান নয়। (ব্যবহারকারীদের অ্যাডবি চলবে না))
টুলমেকারস্টেভ

5

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

দাবি অস্বীকার: এটি অ্যান্ড্রয়েডে একটি গোপন পদ্ধতি ব্যবহার করে, যার অর্থ এটি সামঞ্জস্যপূর্ণ নাও হতে পারে। যাইহোক, আমার পরীক্ষায়, এটি কাজ করে বলে মনে হচ্ছে।

পদ্ধতিটি হ'ল ইনপুটমেথডম্যানেজার # getInputMethodWindowVisibleHeight () , এবং এটি ললিপপ (5.0) সাল থেকে বিদ্যমান।

বর্তমান কীবোর্ডের পিক্সেলগুলিতে উচ্চতা ফেরত দেওয়া কল তত্ত্ব অনুসারে, একটি কীবোর্ড 0 পিক্সেল লম্বা হওয়া উচিত নয়, তাই আমি একটি সাধারণ উচ্চতার চেক করলাম (কোটলিনে):

val imm by lazy { context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
if (imm.inputMethodWindowVisibleHeight > 0) {
    //keyboard is shown
else {
    //keyboard is hidden
}

আমি যখন লুকানো পদ্ধতিগুলি কল করি তখন প্রতিবিম্ব এড়ানোর জন্য আমি অ্যান্ড্রয়েড হাইড এপিআই ব্যবহার করি (আমি যে অ্যাপ্লিকেশনগুলি বিকাশ করি যা বেশিরভাগ হ্যাকি / টিউনার অ্যাপ্লিকেশনগুলির জন্য প্রচুর পরিমাণে করি) তবে প্রতিচ্ছবিতেও এটি সম্ভব হওয়া উচিত:

val imm by lazy { context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm) as Int
//use the height val in your logic

প্রতিচ্ছবিগুলির
আশ্চর্যরূপে

4

এটি আমার প্রয়োজনীয় প্রয়োজনীয়তার জন্য খুব কম জটিল ছিল। আশা করি এটি সাহায্য করতে পারে:

মূল কার্যকলাপে:

public void dismissKeyboard(){
    InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(mSearchBox.getWindowToken(), 0);
    mKeyboardStatus = false;
}

public void showKeyboard(){
    InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    mKeyboardStatus = true;
}

private boolean isKeyboardActive(){
    return mKeyboardStatus;
}

MKeyboardStatus জন্য ডিফল্ট primative বুলিয়ান মান সক্রিয়া করা হবে মিথ্যা

তারপরে নিম্নলিখিত মানটি যাচাই করুন এবং প্রয়োজনে একটি ক্রিয়া করুন:

 mSearchBox.requestFocus();
    if(!isKeyboardActive()){
        showKeyboard();
    }else{
        dismissKeyboard();
    }

4

আপনার যদি কীবোর্ডের স্থিতি পরীক্ষা করতে হয় তবে এটি কাজ করা উচিত:

fun Activity.isKeyboardOpened(): Boolean {
    val r = Rect()

    val activityRoot = getActivityRoot()
    val visibleThreshold = dip(UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP)

    activityRoot.getWindowVisibleDisplayFrame(r)

    val heightDiff = activityRoot.rootView.height - r.height()

    return heightDiff > visibleThreshold;
}

fun Activity.getActivityRoot(): View {
    return (findViewById<ViewGroup>(android.R.id.content)).getChildAt(0);
}

যেখানে UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP= 100 এবং ডিপ () হ'ল এমন একো ফানক যা ডিপিটোপেক্সকে রূপান্তর করে:

fun dip(value: Int): Int {
    return (value * Resources.getSystem().displayMetrics.density).toInt()
}

3

আমি গ্লোবাল লেআউটলিস্টনার সেট করে এটি করেছি:

final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
        new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightView = activityRootView.getHeight();
                int widthView = activityRootView.getWidth();
                if (1.0 * widthView / heightView > 3) {
                    //Make changes for Keyboard not visible
                } else {
                    //Make changes for keyboard visible
                }
            }
        });

এটিকে প্রায়শই বলা হবে
ডেনিস নিয়াজ শেভ

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

তার উত্তরটি মৌলিকভাবে আমার মত একই, কেবল আমি তার অনেক মাস আগে আমার কাজ করেছি, এবং তার আরও অগ্রগতি রয়েছে।
পিয়ারসন আর্টফোটো

3

কিবোর্ডশাউনটি যদি দেখানো হয় তবে এটি সত্যিই কাজ করছে এই কোডটি ব্যবহার করে দেখুন তাহলে এই ফাংশনটি আসল মান ফিরে আসবে ....

private final String TAG = "TextEditor";
private TextView mTextEditor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_editor);
    mTextEditor = (TextView) findViewById(R.id.text_editor);
    mTextEditor.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            isKeyboardShown(mTextEditor.getRootView());
        }
    });
}

private boolean isKeyboardShown(View rootView) {
    /* 128dp = 32dp * 4, minimum button height 32dp and generic 4 rows soft keyboard */
    final int SOFT_KEYBOARD_HEIGHT_DP_THRESHOLD = 128;

    Rect r = new Rect();
    rootView.getWindowVisibleDisplayFrame(r);
    DisplayMetrics dm = rootView.getResources().getDisplayMetrics();
    /* heightDiff = rootView height - status bar height (r.top) - visible frame height (r.bottom - r.top) */
    int heightDiff = rootView.getBottom() - r.bottom;
    /* Threshold size: dp to pixels, multiply with display density */
    boolean isKeyboardShown = heightDiff > SOFT_KEYBOARD_HEIGHT_DP_THRESHOLD * dm.density;

    Log.d(TAG, "isKeyboardShown ? " + isKeyboardShown + ", heightDiff:" + heightDiff + ", density:" + dm.density
            + "root view height:" + rootView.getHeight() + ", rect:" + r);

    return isKeyboardShown;
}

#KeyboardShown এটি প্রদর্শিত না হলে নিজেকে কল করে চলে।
মনদীপ সিং

2

আমার ক্ষেত্রে EditTextআমার লেআউটটি পরিচালনা করার জন্য আমার কেবল একটি ছিল তাই আমি এই সমাধানটি সাদাকালো করে এলাম । এটি ভালভাবে কাজ করে, মূলত এটি একটি প্রথা EditTextযা ফোকাসের জন্য শোনায় এবং ফোকাস পরিবর্তিত হলে বা পিছনে / সম্পন্ন বোতামটি টিপে থাকলে স্থানীয় সম্প্রচার পাঠায়। কাজ করার জন্য Viewআপনার সাথে আপনার লেআউটে একটি ডামি স্থাপন করা দরকার android:focusable="true"এবং android:focusableInTouchMode="true"কারণ যখন আপনি কল clearFocus()করবেন তখন প্রথম ফোকাসযোগ্য ভিউতে ফোকাসটি পুনরায় বরাদ্দ করা হবে। ডামি ভিউ উদাহরণ:

<View
android:layout_width="1dp"
android:layout_height="1dp"
android:focusable="true"
android:focusableInTouchMode="true"/>

অতিরিক্ত ইনফস

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


1

অ্যান্ড্রয়েডে আপনি ADB শেলের মাধ্যমে সনাক্ত করতে পারবেন। আমি এই পদ্ধতিটি লিখেছি এবং ব্যবহার করেছি:

{
        JSch jsch = new JSch();
        try {
            Session session = jsch.getSession("<userName>", "<IP>", 22);
            session.setPassword("<Password>");
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();

            ChannelExec channel = (ChannelExec)session.openChannel("exec");
            BufferedReader in = new BufferedReader(new    
            InputStreamReader(channel.getInputStream()));
            channel.setCommand("C:/Android/android-sdk/platform-tools/adb shell dumpsys window 
            InputMethod | findstr \"mHasSurface\"");
            channel.connect();

            String msg = null;
            String msg2 = " mHasSurface=true";

            while ((msg = in.readLine()) != null) {
                Boolean isContain = msg.contains(msg2);
                log.info(isContain);
                if (isContain){
                    log.info("Hiding keyboard...");
                    driver.hideKeyboard();
                }
                else {
                    log.info("No need to hide keyboard.");
                }
            }

            channel.disconnect();
            session.disconnect();

        } catch (JSchException | IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

1
সমস্ত আমদানি এবং একটি কার্যনির্বাহী উদাহরণ সহ আপনি আরও উত্তম উদাহরণ দিয়ে এই উত্তরটি উন্নত করতে পারেন?
ব্যবহারকারী 3

1
final View activityRootView = findViewById(R.id.rootlayout);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            activityRootView.getWindowVisibleDisplayFrame(r);

            int screenHeight = activityRootView.getRootView().getHeight();
            Log.e("screenHeight", String.valueOf(screenHeight));
            int heightDiff = screenHeight - (r.bottom - r.top);
            Log.e("heightDiff", String.valueOf(heightDiff));
            boolean visible = heightDiff > screenHeight / 3;
            Log.e("visible", String.valueOf(visible));
            if (visible) {
                Toast.makeText(LabRegister.this, "I am here 1", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(LabRegister.this, "I am here 2", Toast.LENGTH_SHORT).show();
            }
        }
});

1

@IWantScala এর উত্তর দুর্দান্ত তবে আমার জন্য কাজ করা না হর
rootView.getRootView().getHeight()সবসময় একই মান থাকে

একটি উপায় দুটি বার সংজ্ঞায়িত করা হয়

private int maxRootViewHeight = 0;
private int currentRootViewHeight = 0;

বিশ্ব শ্রোতা যুক্ত করুন

rootView.getViewTreeObserver()
    .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            currentRootViewHeight = rootView.getHeight();
            if (currentRootViewHeight > maxRootViewHeight) {
                maxRootViewHeight = currentRootViewHeight;
            }
        }
    });

তারপরে চেক করুন

if (currentRootViewHeight >= maxRootViewHeight) {
    // Keyboard is hidden
} else {
    // Keyboard is shown
}

ঠিকভাবে কাজ করে


1

এখন অবধি কোটলিনের ভিত্তিতে অ্যান্ড্রয়েড আর থেকে শুরু করে সরাসরি পথ way

 val imeInsets = view.rootWindowInsets.getInsets(Type.ime()) 
    if (imeInsets.isVisible) { 
     //Ime is visible
     //Lets move our view by the height of the IME
     view.translationX = imeInsets.bottom }

0

আমারও একই সমস্যা ছিল। আমাকে স্ক্রিনের এন্টার বোতামে প্রতিক্রিয়া জানাতে হবে (যা কীবোর্ডটি লুকিয়েছিল)। এক্ষেত্রে আপনি কীবোর্ডটি টেক্সট ভিউটির সাথে ওএনডিটরএকশনটিতে সাবস্ক্রাইব করতে পারেন - আপনার যদি একাধিক সম্পাদনাযোগ্য বাক্স থাকে তবে তার সবগুলিতে সাবস্ক্রাইব করুন।

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


আমার জন্য কাজ করে না। আমি শুধুমাত্র অনেডিটারএকশন এন্টার কীটি পেয়েছি।
3c71

0

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

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

আপ টু ডেট থাকার জন্য, আপনি কেবল এই অপারেশনটি পুনরাবৃত্তি করুন, যেমন প্রতি 200 মিলিসেকেন্ড, হ্যান্ডলার ব্যবহার করে।

নীচের বাস্তবায়নটি কেবল একটি একক চেক করে।
আপনি যদি একাধিক চেক করেন তবে আপনার সমস্ত (_ কীবোর্ডভিজিবল) পরীক্ষা সক্ষম করা উচিত।

public interface OnKeyboardShowHide
{
    void    onShowKeyboard( Object param );
    void    onHideKeyboard( Object param );
}

private static Handler      _keyboardHandler    = new Handler();
private boolean             _keyboardVisible    = false;
private OnKeyboardShowHide  _keyboardCallback;
private Object              _keyboardCallbackParam;

public void start( OnKeyboardShowHide callback, Object callbackParam )
{
    _keyboardCallback      = callback;
    _keyboardCallbackParam = callbackParam;
    //
    View view = getCurrentFocus();
    if (view != null)
    {
        InputMethodManager imm = (InputMethodManager) getSystemService( Activity.INPUT_METHOD_SERVICE );
        imm.hideSoftInputFromWindow( view.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY, _keyboardResultReceiver );
        imm.showSoftInput( view, InputMethodManager.SHOW_IMPLICIT, _keyboardResultReceiver );
    }
    else // if (_keyboardVisible)
    {
        _keyboardVisible = false;
        _keyboardCallback.onHideKeyboard( _keyboardCallbackParam );
    }
}

private ResultReceiver      _keyboardResultReceiver = new ResultReceiver( _keyboardHandler )
{
    @Override
    protected void onReceiveResult( int resultCode, Bundle resultData )
    {
        switch (resultCode)
        {
            case InputMethodManager.RESULT_SHOWN :
            case InputMethodManager.RESULT_UNCHANGED_SHOWN :
                // if (!_keyboardVisible)
                {
                    _keyboardVisible = true;
                    _keyboardCallback.onShowKeyboard( _keyboardCallbackParam );
                }
                break;
            case InputMethodManager.RESULT_HIDDEN :
            case InputMethodManager.RESULT_UNCHANGED_HIDDEN :
                // if (_keyboardVisible)
                {
                    _keyboardVisible = false;
                    _keyboardCallback.onHideKeyboard( _keyboardCallbackParam );
                }
                break;
        }
    }
};

কিভাবে এটি কল এবং কোথায়?
মাহদী আস্তানাই

0

সফটকিবোর্ডটি দৃশ্যমান কিনা তা জানার জন্য এখানে এক কার্যক্রম রয়েছে।

  1. ActivityManager.getRunningServices (max_count_of_services) ব্যবহার করে সিস্টেমে চলমান পরিষেবাগুলির জন্য চেক করুন;
  2. ফিরে আসা ক্রিয়াকলাপব্যবস্থাপনা.রুনিংস সার্ভিসআইএনফো উদাহরণগুলি থেকে, সফ্ট কীবোর্ড পরিষেবার জন্য ক্লায়েন্টকাউন্টের মানটি পরীক্ষা করুন ।
  3. পূর্বোক্ত ক্লায়েন্ট অ্যাকাউন্টটি প্রতিবার বাড়ানো হবে, নরম কীবোর্ড দেখানো হবে। উদাহরণস্বরূপ, ক্লায়েন্টকাউন্ট যদি প্রাথমিকভাবে 1 হয়, কীবোর্ড দেখানো হয় তখন এটি 2 হবে।
  4. কীবোর্ড বরখাস্তে, ক্লায়েন্টকাউন্ট হ্রাস করা হয়। এই ক্ষেত্রে, এটি 1 এ পুনরায় সেট হয়।

কয়েকটি জনপ্রিয় কীবোর্ডগুলির শ্রেণিবদ্ধে কিছু কীওয়ার্ড রয়েছে:

  1. গুগল এওএসপি = আইএমই
  2. স্বাইপ = আইএমই
  3. সুইফটকি = কীবোর্ড সার্ভিস
  4. ফ্লিকসি = কীবোর্ড
  5. অ্যাডাপ্টেক্সট = আইএমই (কেপিটিএডাপ্টেক্সটাইম)
  6. স্মার্ট = কীবোর্ড (স্মার্টকিবোর্ড)

ক্রিয়াকলাপব্যবস্থাপনা.রুনিংস সার্ভিসআইএনফো থেকে ক্লাসনামে উপরের নিদর্শনগুলি পরীক্ষা করুন। এছাড়াও, অ্যাক্টিভিটি ম্যানেজ.আরুনিংসোসভারআইনফোর ক্লায়েন্টপ্যাকেজ = অ্যান্ড্রয়েড, ইঙ্গিত দেয় যে কীবোর্ডটি সিস্টেমের সাথে আবদ্ধ।

নরম কীবোর্ড দৃশ্যমান কিনা তা খুঁজে পাওয়ার জন্য কঠোর উপায়ে উল্লিখিত তথ্যগুলি একত্রিত করা যেতে পারে।


0

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

//Declare this Globally

public boolean isKeyBoardVisible = false;

//In OnCreate *[For Activity]*, OnCreateView *[For Fragment]*

text_send.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus)
            isKeyBoardVisible = true;
        else
            isKeyBoardVisible = false;
    }
});

এখন আপনি কি- বোর্ড-ভিজিবল ব্যবহার করতে পারেনকীবোর্ডটি ওপেন বা নট আবহাওয়া পেতে ক্লাসের যে কোনও জায়গায় ভেরিয়েবল । এটা আমার জন্য ভাল কাজ করেছে।

নোট: এই প্রক্রিয়াটি কীবোর্ড প্রোগ্রামেটিক্যালি ব্যবহার খোলা হয় কাজ করছে না InputMethodManager কারণ যে OnFocusChangeListener ডাকা না।


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

0

আমি উত্তরটি কোটলিনে রূপান্তর করেছি, আশা করি এটি কোটলিন ব্যবহারকারীদের জন্য সহায়তা করবে।

private fun checkKeyboardVisibility() {
    var isKeyboardShowing = false

    binding.coordinator.viewTreeObserver.addOnGlobalLayoutListener {
        val r = Rect()
        binding.coordinator.getWindowVisibleDisplayFrame(r)
        val screenHeight = binding.coordinator.rootView.height

        // r.bottom is the position above soft keypad or device button.
        // if keypad is shown, the r.bottom is smaller than that before.
        val keypadHeight = screenHeight - r.bottom


        if (keypadHeight > screenHeight * 0.15) { // 0.15 ratio is perhaps enough to determine keypad height.
            // keyboard is opened
            if (!isKeyboardShowing) {
                isKeyboardShowing = true

            }
        } else {
            // keyboard is closed
            if (isKeyboardShowing) {
                isKeyboardShowing = false

            }
        }
    }
}

0

এটি অ্যাডজাস্টের সাথে কাজ করে না কোনও ক্রিয়াকলাপের পতাকা এবং জীবনচক্র ইভেন্টগুলি ব্যবহৃত হয়। কোটলিনের সাথেও:

/**
 * This class uses a PopupWindow to calculate the window height when the floating keyboard is opened and closed
 *
 * @param activity The parent activity
 *  The root activity that uses this KeyboardManager
 */
class KeyboardManager(private val activity: AppCompatActivity) : PopupWindow(activity), LifecycleObserver {

    private var observerList = mutableListOf<((keyboardTop: Int) -> Unit)>()

    /** The last value of keyboardTop */
    private var keyboardTop: Int = 0

    /** The view that is used to calculate the keyboard top  */
    private val popupView: View?

    /** The parent view  */
    private var parentView: View

    var isKeyboardShown = false
        private set

    /**
     * Create transparent view which will be stretched over to the full screen
     */
    private fun createFullScreenView(): View {
        val view = LinearLayout(activity)
        view.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT)
        view.background = ColorDrawable(Color.TRANSPARENT)
        return view
    }

    init {
        this.popupView = createFullScreenView()
        contentView = popupView

        softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE or LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
        inputMethodMode = INPUT_METHOD_NEEDED

        parentView = activity.findViewById(android.R.id.content)

        width = 0
        height = LayoutParams.MATCH_PARENT

        popupView.viewTreeObserver.addOnGlobalLayoutListener {
            val rect = Rect()
            popupView.getWindowVisibleDisplayFrame(rect)

            val keyboardTop = rect.bottom
            if (this.keyboardTop != keyboardTop) {
                isKeyboardShown = keyboardTop < this.keyboardTop
                this.keyboardTop = keyboardTop
                observerList.forEach { it(keyboardTop) }
            }
        }
        activity.lifecycle.addObserver(this)
    }

    /**
     * This must be called after the onResume of the Activity or inside view.post { } .
     * PopupWindows are not allowed to be registered before the onResume has finished
     * of the Activity
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun start() {
        parentView.post {
            if (!isShowing && parentView.windowToken != null) {
                setBackgroundDrawable(ColorDrawable(0))
                showAtLocation(parentView, Gravity.NO_GRAVITY, 0, 0)
            }
        }
    }

    /**
     * This manager will not be used anymore
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun close() {
        activity.lifecycle.removeObserver(this)
        observerList.clear()
        dismiss()
    }

    /**
     * Set the keyboard top observer. The observer will be notified when the keyboard top has changed.
     * For example when the keyboard is opened or closed
     *
     * @param observer The observer to be added to this provider
     */
    fun registerKeyboardTopObserver(observer: (keyboardTop: Int) -> Unit) {
        observerList.add(observer)
    }
}

কীবোর্ডের উপরে সর্বদা দর্শন রাখা কার্যকর পদ্ধতি

fun KeyboardManager.updateBottomMarginIfKeyboardShown(
        view: View,
        activity: AppCompatActivity,
        // marginBottom of view when keyboard is hide
        marginBottomHideKeyboard: Int,
        // marginBottom of view when keybouard is shown
        marginBottomShowKeyboard: Int
) {
    registerKeyboardTopObserver { bottomKeyboard ->
        val bottomView = ViewUtils.getFullViewBounds(view).bottom
        val maxHeight = ScreenUtils.getFullScreenSize(activity.windowManager).y
        // Check that view is within the window size
        if (bottomView < maxHeight) {
            if (bottomKeyboard < bottomView) {
                ViewUtils.updateMargin(view, bottomMargin = bottomView - bottomKeyboard +
                        view.marginBottom + marginBottomShowKeyboard)
            } else ViewUtils.updateMargin(view, bottomMargin = marginBottomHideKeyboard)
        }
    }
}

যেখানে ফুলভিউবাউন্ডস পান

fun getLocationOnScreen(view: View): Point {
    val location = IntArray(2)
    view.getLocationOnScreen(location)
    return Point(location[0], location[1])
}

fun getFullViewBounds(view: View): Rect {
     val location = getLocationOnScreen(view)
     return Rect(location.x, location.y, location.x + view.width,
            location.y + view.height)
 }

যেখানে getFullScreenSize

fun getFullScreenSize(wm: WindowManager? = null) =
            getScreenSize(wm) { getRealSize(it) }

private fun getScreenSize(wm: WindowManager? = null, block: Display.(Point) -> Unit): Point {
    val windowManager = wm ?: App.INSTANCE.getSystemService(Context.WINDOW_SERVICE)
            as WindowManager
    val point = Point()
    windowManager.defaultDisplay.block(point)
    return point
}

যেখানে আপডেটমার্গিন

fun updateMargin(
        view: View,
        leftMargin: Int? = null,
        topMargin: Int? = null,
        rightMargin: Int? = null,
        bottomMargin: Int? = null
) {
    val layoutParams = view.layoutParams as ViewGroup.MarginLayoutParams
    if (leftMargin != null) layoutParams.leftMargin = leftMargin
    if (topMargin != null) layoutParams.topMargin = topMargin
    if (rightMargin != null) layoutParams.rightMargin = rightMargin
    if (bottomMargin != null) layoutParams.bottomMargin = bottomMargin
    view.layoutParams = layoutParams
}

-1

আমি এটি নিম্নরূপে এটি করেছি, তবে কেবলমাত্র যদি আপনার লক্ষ্যটি কীবোর্ডটি বন্ধ / খুলতে হয় তবে এটির পুনঃপ্রকাশ।

নিকটবর্তী উদাহরণ: (ইতিমধ্যে কি-বোর্ড বন্ধ আছে কিনা তা পরীক্ষা করা হচ্ছে - বন্ধ হলে)

imm.showSoftInput(etSearch, InputMethodManager.HIDE_IMPLICIT_ONLY, new ResultReceiver(null) {
                    @Override
                    protected void onReceiveResult(int resultCode, Bundle resultData) {
                        super.onReceiveResult(resultCode, resultData);
                        if (resultCode != InputMethodManager.RESULT_UNCHANGED_HIDDEN)
                            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                    }
                });

প্রশ্নটি
কিবোর্ডটি

-1

একটি ব্যবহার করা যেতে পারে:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    Log.d(
    getClass().getSimpleName(), 
    String.format("conf: %s", newConfig));

    if (newConfig.hardKeyboardHidden != hardKeyboardHidden) {
        onHardwareKeyboardChange(newConfig.hardKeyboardHidden);

        hardKeyboardHidden = newConfig.hardKeyboardHidden;
    }

    if (newConfig.keyboardHidden != keyboardHidden) {
        onKeyboardChange(newConfig.keyboardHidden);

        keyboardHidden = newConfig.hardKeyboardHidden;
    }

}

public static final int KEYBOARDHIDDEN_UNDEFINED = 0;
public static final int KEYBOARDHIDDEN_NO = 1;
public static final int KEYBOARDHIDDEN_YES = 2;
public static final int KEYBOARDHIDDEN_SOFT = 3;

//todo
private void onKeyboardChange(int keyboardHidden) {

}

//todo
private void onHardwareKeyboardChange(int hardKeyboardHidden) {

}

এটি কেবল হার্ডওয়্যার কীবোর্ডের জন্যই কাজ করবে, সে একটি সফ্টওয়্যার নয়
অ্যান্থনিমোনারি

-1

আমি নমুনা লিখেছি ।

"কীবোর্ড স্ক্রিনের এক্স অংশের বেশি হওয়া উচিত" এই ধারণা ছাড়াই কীবোর্ডের স্থিতি সনাক্ত করতে এই সংগ্রহস্থলটি সহায়তা করতে পারে


-1

আপনি যদি আপনার অ্যাপ্লিকেশনটিতে AndroidR এর জন্য এপিআইস সমর্থন করেন তবে নীচের পদ্ধতিটি ব্যবহার করতে পারেন method

In kotlin :
    var imeInsets = view.rootWindowInsets.getInsets(Type.ime()) 
    if (imeInsets.isVisible) { 
        view.translationX = imeInsets.bottom 
    }

দ্রষ্টব্য: এটি কেবল অ্যান্ড্রয়েডআরের জন্য উপলব্ধ এবং নীচে অ্যান্ড্রয়েড সংস্করণে অন্য কয়েকটি উত্তর অনুসরণ করা দরকার বা আমি এটির জন্য এটি আপডেট করব।

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