මෙම පිස්සුව පැහැදිලි කිරීමට උදව් කිරීම සඳහා, මෘදු යතුරුපුවරුව ගූගල් විසින් අවලස්සන ලෙස සැලකීම ගැන සියලු ඇන්ඩ්රොයිඩ් පරිශීලකයින් වෙනුවෙන් සමාව අයැදීමෙන් ආරම්භ කිරීමට මම කැමැත්තෙමි. එකම සරල ප්රශ්නයට බොහෝ පිළිතුරු, එක් එක් වෙනස් වීමට හේතුව, ඇන්ඩ්රොයිඩ් හි අනෙක් බොහෝ අය මෙන් මෙම API ද භයානක ලෙස නිර්මාණය කර ඇති බැවිනි. එය ප්රකාශ කිරීමට කිසිදු ආචාරශීලී ක්රමයක් ගැන මට සිතිය නොහැකිය.
මට යතුරුපුවරුව සැඟවීමට අවශ්යයි. පහත දැක්වෙන ප්රකාශය සමඟ ඇන්ඩ්රොයිඩ් සැපයීමට මම බලාපොරොත්තු වෙමි : Keyboard.hide(). අවසානය. බොහොම ස්තූතියි. නමුත් ඇන්ඩ්රොයිඩ් හි ගැටලුවක් තිබේ. InputMethodManagerයතුරුපුවරුව සැඟවීමට ඔබ භාවිතා කළ යුතුය . හරි, හොඳයි, මෙය යතුරුපුවරුවට ඇන්ඩ්රොයිඩ් API ය. එහෙත්! ContextIMM වෙත ප්රවේශය ලබා ගැනීම සඳහා ඔබට අවශ්ය වේ . දැන් අපට ගැටලුවක් තිබේ. යතුරුපුවරුව ස්ථිතික හෝ උපයෝගිතා පන්තියකින් සැඟවීමට මට අවශ්ය විය හැකිය Context. හෝ Viewඊටත් වඩා නරක නම්, Windowයතුරුපුවරුව සැඟවීමට ඔබට අවශ්ය දේ (හෝ ඊටත් වඩා නරක ) සඳහන් කිරීමට IMM ට අවශ්ය වේ .
යතුරුපුවරුව සැඟවීම එතරම්ම අභියෝගාත්මක වන්නේ මෙයයි. හිතවත් ගූගල්: මම කේක් සඳහා වට්ටෝරුව සොයා බලන විට RecipeProvider, කේක් අනුභව කරන්නේ කවුරුන්ද සහ එය අනුභව කරන්නේ කොතැනද යන්න පිළිබඳව මා මුලින් පිළිතුරු නොදුන්නේ නම් මට වට්ටෝරුව ලබා දීම ප්රතික්ෂේප කරන පෘථිවියේ නොමැත !!
මෙම කනගාටුදායක කතාව අවසන් වන්නේ අවලස්සන සත්යයෙනි: ඇන්ඩ්රොයිඩ් යතුරුපුවරුව සැඟවීමට ඔබට හඳුනාගැනීමේ ආකාර 2 ක් සැපයීමට අවශ්ය වනු ඇත: a Contextසහ a Viewහෝ a Window.
මම ස්ථිතික උපයෝගීතා ක්රමයක් නිර්මාණය කර ඇති අතර එමඟින් ඔබට එය ඉතා තදින් කළ හැකිය Activity.
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view, so we can grab the correct window token from it.
View view = activity.getCurrentFocus();
//If no view currently has focus, create a new one, just so we can grab a window token from it
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
මෙම උපයෝගීතා ක්රමය ක්රියාත්මක වන්නේ a වෙතින් ඇමතූ විට පමණක් බව මතක තබා ගන්න Activity! ඉහත ක්රමය නිසි කවුළු ටෝකනය ලබා ගැනීම සඳහා getCurrentFocusඉලක්කයේ ඇමතුම් ලබා ගනී Activity.
නමුත් යතුරුපුවරුව EditTextසත්කාරක සමාගමකින් සැඟවීමට ඔබට අවශ්ය යැයි සිතමු DialogFragment? ඒ සඳහා ඔබට ඉහත ක්රමය භාවිතා කළ නොහැක:
hideKeyboard(getActivity()); //won't work
මෙය ක්රියා නොකරන්නේ ඔබ Fragmentසත්කාරක සමාගමට යොමු කිරීමක් කරන නිසාය Activity, Fragmentඑය පෙන්වන අතරතුර අවධානය යොමු කළ නොහැකි පාලනයක් නොමැත ! වාව්! එබැවින්, යතුරු පුවරුව කැබලිවලින් සැඟවීම සඳහා, මම පහළ මට්ටමේ, වඩාත් සුලභ හා අවලස්සන වෙත යොමු වෙමි:
public static void hideKeyboardFrom(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
මෙම විසඳුම පසුපස හඹා යාමෙන් වැඩි කාලයක් නාස්ති කිරීමෙන් ලබාගත් අමතර තොරතුරු කිහිපයක් පහත දැක්වේ:
WindowSoftInputMode ගැන
දැනුවත්ව සිටිය යුතු තවත් මතභේදයක් තිබේ. පෙරනිමියෙන්, EditTextඔබගේ පළමු හෝ අවධානය යොමු කළ හැකි පාලනයට ඇන්ඩ්රොයිඩ් ස්වයංක්රීයව මූලික අවධානය යොමු කරයි Activity. එය ස්වාභාවිකවම අනුගමනය කරන්නේ InputMethod (සාමාන්යයෙන් මෘදු යතුරුපුවරුව) අවධානය යොමු කිරීමේ සිදුවීමට ප්රතිචාර දක්වමින් එය පෙන්වයි. හි ඇති windowSoftInputModeගුණාංගය AndroidManifest.xml, සකසා ඇති විට stateAlwaysHidden, ස්වයංක්රීයව පවරා ඇති මෙම මූලික අවධානය නොසලකා හැරීමට යතුරුපුවරුවට උපදෙස් දෙයි.
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
ඔබ පාලනය ස්පර්ශ කරන විට ( focusable="false"සහ / හෝ focusableInTouchMode="false"පාලනයට පවරා නොමැති නම්) යතුරුපුවරුව විවෘත වීම වැළැක්වීමට කිසිවක් කළ නොහැකි බව පෙනේ . පෙනෙන විදිහට, windowSoftInputMode සැකසුම අදාළ වන්නේ ස්වයංක්රීය නාභිගත සිදුවීම් වලට මිස ස්පර්ශ සිදුවීම් මගින් අවුලුවන සිදුවීම් වෙත අවධානය යොමු කිරීමට නොවේ.
එබැවින් stateAlwaysHiddenඉතා දුර්වල ලෙස නම් කර ඇත. ඒ ignoreInitialFocusවෙනුවට එය හැඳින්විය යුතුය .
මෙය උපකාරී වේ යැයි සිතමි.
යාවත්කාලීන කිරීම: කවුළු ටෝකනයක් ලබා ගැනීමට තවත් ක්රම
නාභිගත වූ දර්ශනයක් නොමැති නම් (උදා: ඔබ කොටස් වෙනස් කළහොත් සිදුවිය හැකිය), ප්රයෝජනවත් කවුළු ටෝකනයක් සපයන වෙනත් අදහස් තිබේ.
මේවා ඉහත කේතය සඳහා විකල්ප වේ. if (view == null) view = new View(activity); මේවා ඔබේ ක්රියාකාරකමට නිශ්චිතවම යොමු නොවේ.
කොටස් පන්තියක් ඇතුළත:
view = getView().getRootView().getWindowToken();
කැබැල්ලක් fragmentපරාමිතියක් ලෙස ලබා දී ඇත:
view = fragment.getView().getRootView().getWindowToken();
ඔබගේ අන්තර්ගත ශරීරයෙන් ආරම්භ කිරීම:
view = findViewById(android.R.id.content).getRootView().getWindowToken();
යාවත්කාලීනය 2: ඔබ පසුබිමෙන් යෙදුම විවෘත කළහොත් යතුරුපුවරුව නැවත පෙන්වීම වළක්වා ගැනීමට අවධානය යොමු කරන්න
ක්රමයේ අවසානයට මෙම රේඛාව එක් කරන්න:
view.clearFocus();