অ্যান্ড্রয়েডে কীভাবে "ভার্চুয়াল কীবোর্ড শো / আড়াল" ইভেন্টটি ক্যাপচার করবেন?


227

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

এটা কি সম্ভব?

ধন্যবাদ!


উত্তর:


69

বিঃদ্রঃ

এই সমাধানটি সফ্ট কীবোর্ডগুলির জন্য কাজ onConfigurationChangedকরবে না এবং সফ্ট (ভার্চুয়াল) কীবোর্ডের জন্য কল করা হবে না।


আপনাকে নিজেরাই কনফিগারেশন পরিবর্তনগুলি পরিচালনা করতে হবে।

http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

নমুনা:

// from the link above
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);


    // Checks whether a hardware keyboard is available
    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
        Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
    } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
    }
}

তারপরে কিছু দৃশ্যের দৃশ্যমানতা পরিবর্তন করুন, একটি ক্ষেত্র আপডেট করুন এবং আপনার বিন্যাসের ফাইলটি পরিবর্তন করুন।


4
@ শিয়ামি চেষ্টা করুন newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO~ ক্রিস
সিমনাইন

3
এটি কেবলমাত্র তখনই কাজ করে যদি আপনি অ্যান্ড্রয়েড ম্যানিফেস্টে আপনার পছন্দসই কনফিগারচগুলি শোনার জন্য কার্যকলাপটি নিবন্ধভুক্ত করেন।
রাউল অগ্রহায়ট

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

17
এটি "ভার্চুয়াল" কীবোর্ডগুলির জন্য কাজ করছে না যা আসল প্রশ্ন ছিল।
brummfondel

18
ভাল, প্রশ্নটি ছিল সফট কী-বোর্ড সম্পর্কে, কেন একটি হার্ডওয়্যার কীবোর্ড সম্পর্কে স্বীকৃত উত্তর? -1!
ভাইটালি

56

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

boolean isOpened = false;

public void setListenerToRootView() {
    final View activityRootView = getWindow().getDecorView().findViewById(android.R.id.content);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
            if (heightDiff > 100) { // 99% of the time the height diff will be due to a keyboard.
                Toast.makeText(getApplicationContext(), "Gotcha!!! softKeyboardup", 0).show();

                if (isOpened == false) {
                    //Do two things, make the view top visible and the editText smaller
                }
                isOpened = true;
            } else if (isOpened == true) {
                Toast.makeText(getApplicationContext(), "softkeyborad Down!!!", 0).show();
                isOpened = false;
            }
        }
    });
}

দ্রষ্টব্য: যদি ব্যবহারকারী কোনও ভাসমান কীবোর্ড ব্যবহার করে তবে এই পদ্ধতির কারণে সমস্যার সৃষ্টি হবে।


1
addOnGlobalLayoutListener?
coolcool1994

7
এই গন্ধ স্মৃতি ফুটো মত। আপনি বিশ্বব্যাপী কোনও শ্রোতাকে যুক্ত করছেন, যিনি আপনাকে ধরে রাখবেন এবং আপনাকে কখনই যেতে দেবেন না।
নমনীয়.কম

9
এছাড়াও এই এক ক্রিয়াকলাপ সাথে সেট কার্যকরী হবে না android:windowSoftInputMode="adjustPan", অথবা adjustResizeএকটি পর্দা জুড়ে প্রদর্শন উইন্ডোটির সাথে, যেমন বিন্যাস মাপ পরিবর্তন করা হয় না।
অয়নোক্লাস্ট ব্রিঘাম

1
এটি কেবলমাত্র অ্যাড্রেসাইসাইজ সহ কাজ করে। অ্যাডজাস্টপ্যানের জন্য, হাইটডিফ কখনও পরিবর্তন হয় না।
অ্যালেক্সহিলটন

2
আপনি বুলিয়ান তুলনা করছেন কেন ?
জেরুস

37

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

main.xml

   <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >
        <EditText
             android:id="@+id/SearchText" 
             android:text="" 
             android:inputType="text"
             android:layout_width="fill_parent"
             android:layout_height="34dip"
             android:singleLine="True"
             />
        <Button
             android:id="@+id/Search" 
             android:layout_width="60dip"
             android:layout_height="34dip"
             android:gravity = "center"
             />
    </LinearLayout>

এখন আপনার ক্রিয়াকলাপের ভিতরে আপনার বিন্যাসের জন্য সাবক্লাস ঘোষণা করুন (main.xML)

    public class MainSearchLayout extends LinearLayout {

    public MainSearchLayout(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.main, this);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.d("Search Layout", "Handling Keyboard Window shown");

        final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
        final int actualHeight = getHeight();

        if (actualHeight > proposedheight){
            // Keyboard is shown

        } else {
            // Keyboard is hidden
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

আপনি সাবক্লাস কনস্ট্রাক্টরে আমাদের ক্রিয়াকলাপের জন্য লেআউট স্ফীত করে এমন কোডটি থেকে আপনি দেখতে পারেন

inflater.inflate(R.layout.main, this);

এবং এখন কেবলমাত্র আমাদের ক্রিয়াকলাপের জন্য উপক্ল্যাসযুক্ত বিন্যাসের সামগ্রী প্রদর্শন সেট করুন।

public class MainActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MainSearchLayout searchLayout = new MainSearchLayout(this, null);

        setContentView(searchLayout);
    }

    // rest of the Activity code and subclassed layout...

}

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

4
এটি অ্যান্ড্রয়েডের জন্য কাজ করে না: উইন্ডোসফট ইনপুটমোড = "অ্যাডজাস্টপ্যান"। আমি চেয়েছিলাম যে সফট কীবোর্ড প্রদর্শিত হওয়ার পরে আমার স্ক্রিনটি সঙ্কুচিত না হওয়া উচিত। আপনি দয়া করে কোনও স্থিরতা বলতে পারেন যাতে এটি অ্যাডজাস্টপ্যানের জন্যও কার্যকর হয়
শিরিশ হার্ভাড

এটি কাজ করছে না, এটি সর্বদা এখানে অন্য অংশে যায় যদি (প্রকৃত উচ্চতা> প্রস্তাবিত উচ্চতা) {// কীবোর্ড দেখানো হয়} অন্য {//
কীবোর্ডটি

আপনি একই ধারণাটির সাথে একটি কাস্টম ভিউও
জুলিও রডরিগস

1
ক্রিয়াকলাপের জন্য android:windowSoftInputMode="adjustPan"বা adjustResizeএকটি পূর্ণস্ক্রিন উইন্ডো সহ সেট করা ক্রিয়াকলাপগুলির জন্য কাজ করবে না , কারণ লেআউটটি কখনই আকার পরিবর্তন করে না।
আয়নোক্লাস্ট ব্রিগহাম

35

আমি এইভাবে করেছি:

যোগ OnKeyboardVisibilityListenerইন্টারফেস।

public interface OnKeyboardVisibilityListener {
    void onVisibilityChanged(boolean visible);
}

হোমঅ্যাক্টিভিটি.জভা :

public class HomeActivity extends Activity implements OnKeyboardVisibilityListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_up);
    // Other stuff...
    setKeyboardVisibilityListener(this);
}

private void setKeyboardVisibilityListener(final OnKeyboardVisibilityListener onKeyboardVisibilityListener) {
    final View parentView = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
    parentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        private boolean alreadyOpen;
        private final int defaultKeyboardHeightDP = 100;
        private final int EstimatedKeyboardDP = defaultKeyboardHeightDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0);
        private final Rect rect = new Rect();

        @Override
        public void onGlobalLayout() {
            int estimatedKeyboardHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, parentView.getResources().getDisplayMetrics());
            parentView.getWindowVisibleDisplayFrame(rect);
            int heightDiff = parentView.getRootView().getHeight() - (rect.bottom - rect.top);
            boolean isShown = heightDiff >= estimatedKeyboardHeight;

            if (isShown == alreadyOpen) {
                Log.i("Keyboard state", "Ignoring global layout change...");
                return;
            }
            alreadyOpen = isShown;
            onKeyboardVisibilityListener.onVisibilityChanged(isShown);
        }
    });
}


@Override
public void onVisibilityChanged(boolean visible) {
    Toast.makeText(HomeActivity.this, visible ? "Keyboard is active" : "Keyboard is Inactive", Toast.LENGTH_SHORT).show();
  }
}

আশা করি এটি আপনাকে সহায়তা করবে।


2
ধন্যবাদ হিরেন এটি নিখুঁত সমাধান +1
হরিন কক্লোটার

1
ধন্যবাদ, আমার জন্য কাজ করেছেন! : আপনি শুধু আপনার RecyclerView সমন্বয় চাইলে এখানে সমাধান দেখতে stackoverflow.com/a/43204258/373106
ডেভিড Papirov

1
নিখুঁত পুনঃব্যবহারযোগ্য বাস্তবায়ন, ক্রিয়াকলাপ বা
খণ্ডিত

1
সত্যিই সুন্দর টাই।
জাওটাওবাও

@ ডেভিডপাপিরভ, আপনি একটি পুনর্ব্যবহারযোগ্য ভিউয়ের লিঙ্কটি আটকে দিয়েছেন, তবে এখানে এটি উল্লেখ করা হয়নি।
কুলমাইন্ড

22

নেবোজসা টমসিকের কোডের উপর ভিত্তি করে আমি নিম্নলিখিত রিলেটিভলআউট-সাবক্লাসটি তৈরি করেছি:

import java.util.ArrayList;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

public class KeyboardDetectorRelativeLayout extends RelativeLayout {

    public interface IKeyboardChanged {
        void onKeyboardShown();
        void onKeyboardHidden();
    }

    private ArrayList<IKeyboardChanged> keyboardListener = new ArrayList<IKeyboardChanged>();

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

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

    public KeyboardDetectorRelativeLayout(Context context) {
        super(context);
    }

    public void addKeyboardStateChangedListener(IKeyboardChanged listener) {
        keyboardListener.add(listener);
    }

    public void removeKeyboardStateChangedListener(IKeyboardChanged listener) {
        keyboardListener.remove(listener);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
        final int actualHeight = getHeight();

        if (actualHeight > proposedheight) {
            notifyKeyboardShown();
        } else if (actualHeight < proposedheight) {
            notifyKeyboardHidden();
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    private void notifyKeyboardHidden() {
        for (IKeyboardChanged listener : keyboardListener) {
            listener.onKeyboardHidden();
        }
    }

    private void notifyKeyboardShown() {
        for (IKeyboardChanged listener : keyboardListener) {
            listener.onKeyboardShown();
        }
    }

}

এটি বেশ সূক্ষ্মভাবে কাজ করে ... চিহ্নিত করুন, আপনার ক্রিয়াকলাপের সফ্ট ইনপুট মোডটি "উইন্ডো ম্যানেজআর.লায়আউটপ্যারামস.স.ফ.এফ.আইএনপিইউ ADADUSUST_RESIZE" এ সেট করা থাকলে এই সমাধানটি কার্যকর হবে Mark


3
এটি অ্যান্ড্রয়েডের জন্য কাজ করে না: উইন্ডোসফট ইনপুটমোড = "অ্যাডজাস্টপ্যান"। আমি চেয়েছিলাম যে সফট কীবোর্ড প্রদর্শিত হওয়ার পরে আমার স্ক্রিনটি সঙ্কুচিত না হওয়া উচিত। আপনি দয়া করে কোনও স্থিরতা বলতে পারেন যাতে এটি অ্যাডজাস্টপ্যানের জন্যও কার্যকর হয়
শিরিশ হার্ভাড

1
এছাড়াও এই এক ক্রিয়াকলাপ সাথে সেট কার্যকরী হবে না android:windowSoftInputMode="adjustPan", অথবা adjustResizeএকটি পর্দা জুড়ে প্রদর্শন উইন্ডোটির সাথে, যেমন বিন্যাস মাপ পরিবর্তন করা হয় না।
আয়নোক্লাস্ট ব্রিঘাম

এটি বেশ কয়েকবার ট্রিগার।
zionpi

22

@ অমলবিটের উত্তরের মতো, বিশ্বব্যাপী বিন্যাসে শ্রোতার নিবন্ধন করুন এবং ডেক্টরভিউর দৃশ্যমান নীচে এবং এর প্রস্তাবিত নীচের পার্থক্যটি গণনা করুন, যদি পার্থক্যটি কিছু মানের (অনুমান করা আইএমই এর উচ্চতা) এর চেয়ে বড় হয়, আমরা মনে করি আইএমই আপ হয়েছে:

    final EditText edit = (EditText) findViewById(R.id.edittext);
    edit.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (keyboardShown(edit.getRootView())) {
                Log.d("keyboard", "keyboard UP");
            } else {
                Log.d("keyboard", "keyboard Down");
            }
        }
    });

private boolean keyboardShown(View rootView) {

    final int softKeyboardHeight = 100;
    Rect r = new Rect();
    rootView.getWindowVisibleDisplayFrame(r);
    DisplayMetrics dm = rootView.getResources().getDisplayMetrics();
    int heightDiff = rootView.getBottom() - r.bottom;
    return heightDiff > softKeyboardHeight * dm.density;
}

উচ্চতা প্রান্তিক 100 হ'ল IME এর অনুমানিত ন্যূনতম উচ্চতা।

এটি অ্যাডজাস্টপ্যান এবং অ্যাডজাস্টারাইজ উভয়ের পক্ষে কাজ করে।


2
আমি শুধু আমার চুল টানতে চলেছি !! আপনি আমার চুল বাঁচিয়েছেন;)
বিজয় সিং চৌহান

1
এটি এখানে একমাত্র ভাল উত্তর, এটি নরম কীবোর্ড নিখুঁতভাবে কাজ করে, আপনাকে ধন্যবাদ
জেড 3nk

12

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

public class CheckinLayout extends RelativeLayout {

    private int largestHeight;

    public CheckinLayout(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.checkin, this);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
        largestHeight = Math.max(largestHeight, getHeight());

        if (largestHeight > proposedheight)
            // Keyboard is shown
        else
            // Keyboard is hidden

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

10

কেউ এটি পোস্ট করেছেন কিনা তা নিশ্চিত নয়। পাওয়া এই সমাধান সহজ ব্যবহার করুন! SoftKeyboard বর্গ gist.github.com হয় । তবে কীবোর্ড পপআপ / লুকানোর ইভেন্ট কলব্যাকের সময় ইউআইতে জিনিসগুলি সঠিকভাবে করার জন্য আমাদের একটি হ্যান্ডলার দরকার:

/*
Somewhere else in your code
*/
RelativeLayout mainLayout = findViewById(R.layout.main_layout); // You must use your root layout
InputMethodManager im = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE);

/*
Instantiate and pass a callback
*/
SoftKeyboard softKeyboard;
softKeyboard = new SoftKeyboard(mainLayout, im);
softKeyboard.setSoftKeyboardCallback(new SoftKeyboard.SoftKeyboardChanged()
{

    @Override
    public void onSoftKeyboardHide() 
    {
        // Code here
        new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    // Code here will run in UI thread
                    ...
                }
            });
    }

    @Override
    public void onSoftKeyboardShow() 
    {
        // Code here
        new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    // Code here will run in UI thread
                    ...
                }
            });

    }   
});

সফটকিবোর্ডটি পাওয়ার জন্য এখানে গিটটি রয়েছে " gist.github.com/felHR85/… "
ডুয়ার্বউ

9

আমি আমার কাস্টম এডিটেক্সট-এ অনি কীপ্রিম (ইন কী কোড, কী-ইভেন্ট ইভেন্ট) ওভাররাইড করে এটি সমাধান করি।

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
        //keyboard will be hidden
    }
}

খণ্ড বা ক্রিয়াকলাপে এটি কীভাবে ব্যবহার করবেন? @ কিবায়েত
মৌলিক

এটি কাজ করে না, আমি কেবল আমার ক্ষেত্রে পৃষ্ঠাটি ছেড়ে দিলেই এটি বলা যেতে পারে।
ডিসানিয়াজজেড

: এই editText থেকে পদ্ধতি, এই উত্তর দেখুন stackoverflow.com/a/5993196/2093236
Dmide

4

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

EditText et = (EditText) findViewById(R.id.et);
et.setOnFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean hasFocus)
        {
            //hasFocus tells us whether soft keyboard is about to show
        }
    });

দ্রষ্টব্য: এই হ্যাকটির সাথে সচেতন হওয়ার একটি বিষয় হ'ল এই কলব্যাকটি যখন EditTextলাভ বা মনোযোগ হারায় তখন সাথে সাথে তা কল করা হয় । এটি আসলে নরম কীবোর্ড প্রদর্শন বা লুকানোর আগে ঠিক আগুনে জ্বলবে । কীবোর্ডটি দেখানোর বা লুকানোর পরে কিছু করার জন্য আমি যেভাবে খুঁজে পেয়েছি তার মধ্যে সর্বোত্তম উপায় Handlerহ'ল কিছু and 400 ডলারের ব্যবহার এবং বিলম্ব করা:

EditText et = (EditText) findViewById(R.id.et);
et.setOnFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean hasFocus)
        {
            new Handler().postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        //do work here
                    }
                }, 400);
        }
    });

1
অন্যথায়, এটি কাজ করে না। রাষ্ট্র পরিবর্তনের পরে ফোকাস হয়েছে OnFocusChangeListenerকিনা তা কেবল তা বলে tells EditTextতবে ফোকাস করার IMEসময় লুকানো থাকতে পারে EditText, এই কেসটি কীভাবে সনাক্ত করা যায়?
ডিসানিয়াজজেড

3

স্যান্ডার, আমি বিশ্বাস করি আপনি সফট কীবোর্ড দ্বারা ব্লক করা দৃশ্যটি দেখানোর চেষ্টা করছেন। এটি http://android-developers.blogspot.com/2009/04/updating-applications- for-on-screen.html ব্যবহার করে দেখুন


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

2

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

package com.helpingdoc;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;

public class MainSearchLayout extends LinearLayout {
    int hieght = 0;
    public MainSearchLayout(Context context, AttributeSet attributeSet) {

        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.main, this);


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.d("Search Layout", "Handling Keyboard Window shown");
       if(getHeight()>hieght){
           hieght = getHeight();
       }
        final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
        final int actualHeight = getHeight();
        System.out.println("....hieght = "+ hieght);
        System.out.println("....actualhieght = "+ actualHeight);
        System.out.println("....proposedheight = "+ proposedheight);
        if (actualHeight > proposedheight){
            // Keyboard is shown


        } else if(actualHeight<proposedheight){
            // Keyboard is hidden

        }

        if(proposedheight == hieght){
             // Keyboard is hidden
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

2
এটি অ্যান্ড্রয়েডের জন্য কাজ করে না: উইন্ডোসফট ইনপুটমোড = "অ্যাডজাস্টপ্যান"। আমি চেয়েছিলাম যে সফট কীবোর্ড প্রদর্শিত হওয়ার পরে আমার স্ক্রিনটি সঙ্কুচিত না হওয়া উচিত। আপনি দয়া করে কোনও স্থিরতা বলতে পারেন যাতে এটি অ্যাডজাস্টপ্যানের জন্যও কার্যকর হয়
শিরিশ হার্ভাড

যখন ফাংশনটি লুকান / দেখান তখন এই শ্রোতার পদ্ধতিটি দু'বার বা তিনবার কল করে। সমস্যা ঠিক কী তা আমি করি না।
জগবীর সিং রাজপুত

2

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

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    View view = getRootView();
    if (view != null && (view = ((ViewGroup) view).getChildAt(0)) != null) {
        setKeyboardVisible(view.getPaddingBottom() > 0);
    }
    super.onLayout(changed, left, top, right, bottom);
}

1

আড়াল করুন | কীবোর্ডের জন্য ইভেন্টগুলি শো করুন অনক্লোবলাল লেআউটলাইজনারে সাধারণ হ্যাকের মাধ্যমে শোনা যায়:

 final View activityRootView = findViewById(R.id.top_root);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();

                if (heightDiff > 100) {
                    // keyboard is up
                } else {
                    // keyboard is down
                }
            }
        });

এখানে অ্যাক্টিভিটি রুটভিউ হ'ল আপনার ক্রিয়াকলাপের মূল দৃশ্য।


তাই আমি ছিল পরিচয় করিয়ে দিতে হবে এবং শুরু initialHeightDiff সেট আমার heightDiff, শুরু 160 এবং kbd সঙ্গে 742 হয়
djdance

0

কীবোর্ড ইভেন্টটি সহজেই পেতে ভিউটিউজারবার ব্যবহার করে ।

layout_parent.viewTreeObserver.addOnGlobalLayoutListener {
            val r = Rect()
            layout_parent.getWindowVisibleDisplayFrame(r)
            if (layout_parent.rootView.height - (r.bottom - r.top) > 100) { // if more than 100 pixels, its probably a keyboard...
                Log.e("TAG:", "keyboard open")
            } else {
                Log.e("TAG:", "keyboard close")
            }
        }

** লেআউট_পিতা আপনার মতামতedit_text.parent


-2

নেবোজসা টমসিকের উত্তর আমার পক্ষে সহায়ক ছিল না। আমার RelativeLayoutসাথে TextViewও এর AutoCompleteTextViewভিতরে আছে। TextViewকীবোর্ডটি প্রদর্শিত হবে এবং কখন এটি লুকানো হবে আমাকে নীচের দিকে স্ক্রোল করতে হবে। এটি সম্পাদন করার জন্য আমি onLayoutপদ্ধতিটি ওভাররড করি এবং এটি আমার পক্ষে ভাল কাজ করে।

public class ExtendedLayout extends RelativeLayout
{
    public ExtendedLayout(Context context, AttributeSet attributeSet)
    {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater)
                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.main, this);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b)
    {
        super.onLayout(changed, l, t, r, b);

        if (changed)
        {
            int scrollEnd = (textView.getLineCount() - textView.getHeight() /
                textView.getLineHeight()) * textView.getLineHeight();
            textView.scrollTo(0, scrollEnd);
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.