Android මෘදු යතුරුපුවරුව වසා / සඟවන්න


3825

මම ඇති EditTextසහ Buttonමගේ සැලැස්ම තුළ.

සංස්කරණ ක්ෂේත්‍රයේ ලිවීමෙන් පසුව සහ මත ක්ලික් කිරීමෙන් Buttonමට අථත්‍ය යතුරු පුවරුව සැඟවීමට අවශ්‍යය. මෙය සරල කේත කෑල්ලක් යැයි මම සිතමි, නමුත් මට එයට උදාහරණයක් සොයාගත හැක්කේ කොතැනින්ද?

යතුරුපුවරුවෙන් පිටත ස්පර්ශ කරන විට.


13
ඔබට ඇත්තේ එක් සංස්කරණ පෙළක් සහ චෙක් පෙට්ටි සහ රේඩියෝ වැනි බොත්තම් කිහිපයක් නම් කුමක් කළ යුතුද? ඔබට යතුරුපුවරුව අවශ්‍ය එකම ස්ථානය තනි සංස්කරණ ටෙක්ස්ට් එකයි. යතුරුපුවරුව සැඟවීම සඳහා වෙනත් දෙයක් තෝරාගෙන / ක්ලික් කර ඇති බව දැන ගැනීමට ඔබ ලියාපදිංචි වන්නේ කෙසේද?
AlikElzin-kilaka

14
මට මෝඩකමක් දැනෙනවා. මට යතුරුපුවරුව ICS හි සැඟවිය නොහැක. මෙහි සියලු ක්‍රම අත්හදා බැලූ අතර ඒවායේ සංයෝජන. කොහෙත්ම නැහැ. එය පෙන්වීමේ ක්‍රමය ක්‍රියාත්මක වේ, නමුත් මට එය සුළං ටෝකනය කුමක් වුවත් සැඟවිය නොහැක, කොඩි, මැනිෆෙස්ට් සැකසුම් හෝ ඉටිපන්දම් ඕනෑම සාන්තුවරයෙකුට සඟවන්න. යතුරුපුවරු ප්‍රදර්ශනයේදී මම මෙය නිතරම දකිමි: I / LatinIME (396): InputType.TYPE_NULL නිශ්චිතව දක්වා ඇත්තේ W / LatinIME (396): අනපේක්ෂිත ආදාන පන්තිය: inputType = 0x00000000 imeOptions = 0x00000000
rupps

4
/ ** * මෘදු යතුරු පුවරුව සැඟවීමට මෙම ක්‍රමය භාවිතා කරයි. * m පරම් ක්‍රියාකාරකම් * / පොදු අවලංගු සැඟවීම සොෆ්ට්කයිබෝඩ් (ක්‍රියාකාරකම් ක්‍රියාකාරකම්) inputMethodManager.hideSoftInputFromWindow (activity.getCurrentFocus (). getWindowToken (), 0); }
හර්ෂල් බෙනකේ

මෙය මට වැඩ කළා
nmxprime

උපාංගවල තිරයේ ප්‍රමාණය සහ විභේදනය වැඩි වීමත් සමඟ අථත්‍ය යතුරුපුවරු සැඟවීම අඩු වැදගත්කමක් දරයි.
අල්-කතිරි කාලිඩ්

Answers:


2046

මෙම පිස්සුව පැහැදිලි කිරීමට උදව් කිරීම සඳහා, මෘදු යතුරුපුවරුව ගූගල් විසින් අවලස්සන ලෙස සැලකීම ගැන සියලු ඇන්ඩ්‍රොයිඩ් පරිශීලකයින් වෙනුවෙන් සමාව අයැදීමෙන් ආරම්භ කිරීමට මම කැමැත්තෙමි. එකම සරල ප්‍රශ්නයට බොහෝ පිළිතුරු, එක් එක් වෙනස් වීමට හේතුව, ඇන්ඩ්‍රොයිඩ් හි අනෙක් බොහෝ අය මෙන් මෙම 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();


2
හරිම ලස්සන ලිවීම. කෙසේ වෙතත් එක් දෙයක් නම්, ඔබ යතුරුපුවරුව අවුලුවන තවත් ක්‍රියාකාරකමක් ආරම්භ කළහොත්, ඔබ ආපසු එන විට යතුරු පුවරුව තවමත් පවතී. ඉහළ ක්‍රියාකාරකමෙන් ඉවත් වන විට ඔබේ ක්‍රමය භාවිතයෙන් යතුරුපුවරුව ඉවත් කිරීමෙන් එය නිවැරදි කරන්න.
ඕවින්ද්

3
mrmirabelle Fragmentඔබට භාවිතා කළ හැකි බව පෙනේgetActivity().getWindow().getDecorView()
McX

1
මෙම ලිපිය විශිෂ්ටයි නමුත් ඔබට ඉතා වැදගත් කොටස් දෙකක් නොමැත. සියුම් වෙනස්කම් අනුවාදයකට සිදු කර නිෂ්පාදනයක් සඳහා සිදු කරනු ලැබේ. උදාහරණයක් ලෙස සැම්සුන්ග් ගැලැක්සි එස් 6 මත යතුරුපුවරුව සැඟවීමට පෙර .clearFocus () භාවිතා කළ යුතුය ... එසේ නොවේ නම් යතුරු පුවරුව සංස්කරණයේ දෙවන ක්ලික් කිරීම මත උත්පතන වනු ඇත: එස්
වෝර්ප්සිට්

17
ගූගල් විසින් එම Keyboard.hide();උපයෝගීතාව සැබවින්ම සැපයිය යුතුය
HendraWD

1
[someView] .getContext () << ක්‍රියාකාරකමට හේතු විය හැක. එය සෑම විටම එකම වස්තුවකි. (ඇතුළත සේවාවන් හැර ...)
ඔලිවර් ඩික්සන්

4420

InputMethodManager භාවිතා කරමින් අථත්‍ය යතුරුපුවරුව සැඟවීමට ඔබට ඇන්ඩ්‍රොයිඩ්ට බල කළ හැකිය, ඇමතුම , hideSoftInputFromWindowඔබේ අවධානය යොමු වූ දර්ශනය අඩංගු කවුළුවේ ටෝකනය තුළට ගමන් කිරීම.

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

මෙය යතුරුපුවරුව සෑම අවස්ථාවකම සැඟවීමට බල කරයි. සමහර අවස්ථාවලදී InputMethodManager.HIDE_IMPLICIT_ONLYයතුරුපුවරුව සැඟවීමට පරිශීලකයාට බල නොකළ විට පමණක් එය සඟවා තැබීම සහතික කිරීම සඳහා ඔබට දෙවන පරාමිතිය ලෙස ඇතුල් වීමට අවශ්‍ය වනු ඇත (මෙනුව රඳවා තබා ගැනීමෙන්).

සටහන: ඔබට මෙය කොට්ලින් හි කිරීමට අවශ්‍ය නම්, භාවිතා කරන්න: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

කොට්ලින් සින්ටැක්ස්

// Check if no view has focus:
 val view = this.currentFocus
 view?.let { v ->
  val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager 
  imm?.hideSoftInputFromWindow(v.windowToken, 0)
 }

14
දෙවන පරාමිතිය ලෙස 0 භාවිතා කරන්නේ නම් ස්තූතියි. නමුත් මම InputMethodManager.HIDE_IMPLICIT_ONLY භාවිතා කරන්නේ නම් යතුරුපුවරුව කිසි විටෙකත් සැඟවී නැත (මම මෙනුව රඳවා නොගත්තද). ඉඟි තිබේද?
RoflcoptrException

27
සිසිල්. පැහැදිලි කිරීම සඳහා, මෙය තිබේ නම් එය බැහැර කරයි, නමුත් එය මතු වීම වළක්වන්නේ නැත , නේද?
චීස්මිස්ටර්

15
මෘදුකාංගය සැඟවීමට පෙර editText.clearFocus () අමතන්න ප්‍රයෝජනවත් විය හැකිය
user2224350

111
ඇමතීමෙන් editText.clearFocus()පසුව InputMethodManager.HIDE_IMPLICIT_ONLYපවා ක්‍රියාත්මක වේ4.1
sprocket12

11
දේ 4.4 / htc මට සේවය ක්රියාත්මක විය View focused = getCurrentFocus()දේ ලබා ගැනීමට අනිවාර්යයෙන්ම දැනට දැක්ම, ඉල්ලා අවධානය යොමු focused.clearFocus()නම්, සහ inputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)(පැහැදිලි කොඩි සමග).
අයනොක්ලාස්ට් බ්‍රිජ්හැම්

806

මෘදු යතුරු පුවරුව සැඟවීමට ද ප්‍රයෝජනවත් වේ:

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);

පරිශීලකයා සංස්කරණ ටෙක්ස්ට් දර්ශනය ස්පර්ශ කරන තෙක් මෘදු යතුරු පුවරුව යටපත් කිරීමට මෙය භාවිතා කළ හැකිය.


116
Android එකතු කිරීමෙන් ඔබට එකම බලපෑමක් ලබා ගත හැකිය: windowSoftInputMode = මැනිෆෙස්ටයේ ඔබගේ ක්‍රියාකාරකම් මත "stateHidden".
BoD

7
ඒපීඅයි 9 වන මට්ටමේ කැබැල්ලකින් (අයිති ක්‍රියාකාරකම් සඳහන් කරමින්) මෙය උත්සාහ කළ අතර එය අවාසනාවකට මෙන් ක්‍රියාත්මක නොවීය. එය onResume සහ onActivityCreated වලින් ඇමතීමට උත්සාහ කර ඇත - කිසිදු බලපෑමක් නැත.
AgentKnopf

2
මම සංවාදයක වැඩ කරන අතර මෙය ක්‍රියාත්මක විය. මම ඇන්ඩ්‍රොයිඩ් 3.2 භාවිතා කරමි. මම එය onCreateDialog (Bundle) ක්‍රමයට ඇතුළත් කළෙමි. එය onCreate ක්‍රමයේදී ක්‍රියාත්මක නොවීය. ඩයලොග් දෙබස = super.onCreateDialog (saveInstanceState); dialog.getWindow (). setSoftInputMode (WindowManager.LayoutParams. SOFT_INPUT_STATE_ALWAYS_HIDDEN); ප්‍රති result ලය වන්නේ එහි ඇති EditText සමඟ මගේ දැක්ම යතුරුපුවරුව නොමැතිව පෙන්වීමයි. පරිශීලකයා සංස්කරණ පා text යක් ස්පර්ශ කළ විට, යතුරු පුවරුව පෙන්වයි.
flobacca

4
අවධානය තවමත් සංස්කරණ ටෙක්ස්ට් එකක ඇති විට මෙය ක්‍රියා නොකරයි (බොත්තමක් ස්පර්ශ කිරීමෙන් පසුව වැනි). ඒ සඳහා රෙටෝගේ විසඳුම භාවිතා කරන්න.
නූමනන්

4
මැනිෆෙස්ට් සැකසුම් ඉක්මවා යාම නරක අදහසක් වන්නේ ඇයි? මම මෙය හඳුන්වන්නේ කැබැල්ලකින්. කැබැල්ලකට අදාළ වන පැහැදිලි සැකසුමක් නොමැත ...
ග්‍රෙග් එනිස්

349

යතුරුපුවරුව සැඟවීමට මට තවත් එක් විසඳුමක් තිබේ:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

මෙහි HIDE_IMPLICIT_ONLYපිහිටීම showFlagසහ 0ස්ථානයේ ගමන් කරන්න hiddenFlag. එය මෘදු යතුරුපුවරුව බලහත්කාරයෙන් වසා දමනු ඇත.


4
ඔබ showflags පරාමිතිය තුළ සැඟවුණු ධජයක් භාවිතා කරයි. මෙය ක්‍රියාත්මක වන්නේ නියතයන් එකම පූර්ණ සංඛ්‍යා භාවිතා කරන බැවිනි. නිවැරදි කොඩි භාවිතා කරන උදාහරණය
ඇලෙක්ස්

ඇන්ඩ්‍රොයිඩ් 4.0 හි පරීක්‍ෂා කර ඇත, මම මෙම විසඳුමට කැමතියි, මන්ද මා සතුව සංස්කරණ පෙළ, බොත්තම් ඇති අතර එම ක්‍රියාකාරකම් කෙරෙහි අවධානය යොමු කළ හැකිය

32
Ark මාක්: මෙම ක්‍රමය "toggleSoftInput" ලෙස හඳුන්වන නිසා "hideSoftInput" නොවේ :)
Sver

19
මෙම විසඳුම යතුරු පුවරුව සැඟවී ඇත්නම් පෙන්වයි. එය නිවැරදි නොවේ
මයිකල් කැට්කොව්

1
K ආකාෂ් අගර්වාල් - යතුරුපුවරුව පෙන්වන නිසා එය ඔබට පමණක් වැඩ කළ බව ඔබ නොසලකා හැරියහොත් එය "ක්‍රියාත්මක වේ". . ඔබ මෙය අමතන අවස්ථාවේ පෙන්වනවාද? එසේ නම්, ඉදිරියට ගොස් එය භාවිතා කරන්න!
මෙවලම් සාදන්නා

149

මයර්ගේ විසඳුම මටත් වැඩ කරයි. මගේ නඩුවේ, ඉහළ මට්ටමේ ටැබ් සත්කාරකයකු වන අතර ටැබ් මාරු කිරීමේදී මට මූලික පදය සැඟවීමට අවශ්‍යයි - ටැබ් ධාරක දර්ශනයෙන් මට කවුළු ටෝකනය ලැබේ.

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}

සෙවුම් දර්ශනය සමඟ වැඩ කිරීමට මට මෙය ලැබුණි. මගේ පිළිතුර සඳහා පහත බලන්න. ස්තූතියි mckoss!
අසුරෙස්පොට්

139

කරුණාකර පහත කේතය උත්සාහ කරන්න onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);

2
Code.google.com/p/android/issues/detail?id=7115 හි විස්තර කර ඇති පරිදි 2.0 සහ 2.1 හි "මෘදු යතුරුපුවරුව සැඟවිය නොහැක" දෝෂය මඟ හැරීමේ මාධ්‍යයක් ලෙස මෙම ක්‍රමය ක්‍රියා කරයි ... HideSoftInputFromWindow ක්‍රමය ඉහත ලැයිස්තුගත කර ඇති මම එය උත්සාහ කළ විට ක්‍රියා කළේ නැත, නමුත් editView.setInputType (0) ක්‍රියා කළේය.
ස්පයික් විලියම්ස්

18
මෙය ජාවඩොක් අනුව නීත්‍යානුකූලයි (කඩුල්ලක් නොවේ) නමුත් මම මෙම ක්‍රමය නැවත editView.setInputType(InputType.TYPE_NULL);
ලියමි

3
කෙසේ වෙතත් මෙය ක්‍රියා කරයි, එය ඇන්ඩ්‍රොයිඩ් සඟවයි: ඉඟිය. මම ඇන්ඩ්‍රොයිඩ් 1.5 භාවිතා කරනවා
තිර්තා


එය ක්‍රියා කරයි, නමුත් එය කර්සරය සඟවයි. මට කර්සරය අවශ්‍යයි, නමුත් පද්ධති යතුරු පුවරුවක් නොමැත.
ස්ටෙෆාන් බ්‍රෙන්ඩ්ල්

129

යාවත්කාලීන කිරීම: මෙම විසඳුම තවදුරටත් ක්‍රියාත්මක නොවන්නේ මන්දැයි මම නොදනිමි (මම ඇන්ඩ්‍රොයිඩ් 23 හි අත්හදා බැලුවෙමි). කරුණාකර ඒ වෙනුවට සෞරබ් පරීක්ගේ විසඳුම භාවිතා කරන්න . මේ තියෙන්නේ:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

පැරණි පිළිතුර:

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

8
මම මෙම කේතය තැබිය යුත්තේ කොතැනින්ද? මම getWindow () ඇලවීමට උත්සාහ කර ඇත. SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); onCreate () හි නමුත් යතුරු පුවරුව කිසි විටෙකත් සැඟවී නැත
user2236096

radioGroup.setOnCheckedChangeListener, API 23
ක්‍රිස්ටියන්

ඔබ සමීපව බැලුවහොත්, InputMethodManager.HIDE_IMPLICIT_ONLY සහ InputMethodManager.SHOW_IMPLICIT එකම අගයක් ඇති අතර එය "1" වේ, එබැවින් මෙම ඇමතුම් අතර වෙනසක් නොමැත. => ක්‍රියා නොකරයි
පලෙජැන්ඩ්‍රෝ

imm.toggleSoftInput අමතන්නේ නම් (InputMethodManager.HIDE_IMPLICIT_ONLY, 0); යතුරුපුවරුව තිරය මත දිස්වනු ඇත :) හොඳම ක්‍රියාත්මක කිරීම නම්: github.com/ravindu1024/android-keyboardlistener ඇන්ඩ්‍රොයිඩ් එස්ඩීකේ හි ලැජ්ජාව
ඩූනා

I don't know why this solution is not work any more- එය ඇන්ඩ්‍රොයිඩ් නිසා , සියල්ල වෙනස් කිරීමට හැකි වනු ඇත, සමහර විට අර්ධ වශයෙන් නරක නිර්මාණ විය හැකිය ... අපි නොසැලකිලිමත් ලෙස ලියන්නෙමු, ඉන්පසු අපි සියල්ලටම පහර දී සියල්ල නැවත ලියන්නෙමු.
කිං කිං

89
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

5
මෙය මට වැඩ කළා! නමුත් ඔබ input.setInputType (0) දැමුවේ ඇයි ? මට එම කේත රේඛාව ඇති විට මට EditTextView සමඟ අන්තර් ක්‍රියා කිරීමට නොහැකි විය (මම එය ඉවත් කළ විට එය ක්‍රියාත්මක විය).
ymerdrengene

බොහෝ විට input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE).
CoolMind

මම input.setInputType(0);මෙම කේතයෙන් ඉවත් කළෙමි . එය යතුරු පුවරුවකින් හැසිරීම වෙනස් inputTypeසඳහා EditText.
CoolMind

74

මෙහි ඇති අනෙක් සියලුම පිළිතුරු ඔබ කැමති පරිදි ක්‍රියා නොකරන්නේ නම්, යතුරුපුවරුව අතින් පාලනය කිරීමේ තවත් ක්‍රමයක් තිබේ.

සමහර EditTextගුණාංග කළමනාකරණය කරන ශ්‍රිතයක් සාදන්න :

public void setEditTextFocus(boolean isFocused) {
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);

    if (isFocused) {
        searchEditText.requestFocus();
    }
}

ඉන්පසු, EditTextඔබ යතුරු පුවරුව විවෘත / වසා දැමීමේ onFocus බවට වග බලා ගන්න :

searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (v == searchEditText) {
            if (hasFocus) {
                // Open keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
            } else {
                // Close keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
            }
        }
    }
});

දැන්, ඔබට යතුරුපුවරුව විවෘත කිරීමට අවශ්‍ය සෑම විටම අතින් අමතන්න:

setEditTextFocus(true);

අවසන් ඇමතුම සඳහා:

setEditTextFocus(false);

+1 - ඔබට සංවෘත යතුරුපුවරුව සමඟ ක්‍රියාකාරකමක් ආරම්භ කිරීමට අවශ්‍ය නම් මෙම විසඳුම භාවිතා කර setEditTextFocus (සත්‍ය) සකසන ඔන්ක්ලික්ලිස්ටනර් එක් කරන්න. චාම් වගේ වැඩ!
schlingel

දෙවන කේතයේ 7 වන සහ 10 වන පේළියේ මට 'සංකේත සන්දර්භය විසඳිය නොහැක'.
gimmegimme

ඒ වෙනුවට getContext () භාවිතා කරන්න
Rotemmiz

61

මේ දක්වා ඇති හොඳම පිළිතුර සෞරබ් පරීක් සතුව ඇත.

නමුත් නිවැරදි ධජ භාවිතා කළ හැකිය.

/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

සැබෑ භාවිතයේ උදාහරණය

/* click button */
public void onClick(View view) {      
  /* hide keyboard */
  ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
      .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

  /* start loader to check parameters ... */
}

/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
    /* parameters not valid ... */

    /* show keyboard */
    ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
        .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

    /* parameters valid ... */
}

1
නවතම අනුවාදය සඳහා මෙය වඩාත් කාර්යක්ෂම වේ. යමෙකුට සෑම විටම පැරණි අනුවාද සඳහා එය වෙනස් කිරීමට අවශ්‍ය වනු ඇත. විශේෂයෙන් v3 ට පෙර.
ඇලෙක්ස්

2
Az මැසන්: භාවිතා කරන්නfragment.getActivity().getSystemService();
ජොහාන් එස්

ප්‍රදර්ශනය සහ සැඟවීම යන දෙකම ආවරණය වන පරිදි මෙය වඩාත් පුළුල් පිළිතුරකි.
ඇන්ඩ්‍රේ ස්ටෝල්ට්ස්

4
නැත. මගේ සැම්සුන් ටැබ්, ඇන්ඩ්‍රොයිඩ් 5.0, ඉහත ඊනියා "යතුරු පුවරුව සඟවන්න" කේතය මෘදු යතුරු පුවරුව ටොගල් කරයි - එය දැනටමත් සැඟවී තිබේ නම්, එය පෙන්වනු ඇත. මෙම ශ්‍රිතයේ නම ටොගල් කිරීමට හේතුවක් තිබේ.
මෙවලම් සාදන්නා

57

එතරම් සෙවීමෙන්, මෙහි මට ප්‍රයෝජනවත් පිළිතුරක් හමු විය

// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

ඇන්ඩ්‍රොයිඩ් 5.1
GMX

55

කෙටි පිළිතුර

ඔබේ OnClickශ්රවණය ඇමතුමක් onEditorActionපිළිබඳ EditTextසමගIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

සරඹ-පහළට

ඇන්ඩ්‍රොයිඩ් හි මෝස්තර රටාව සමඟ මෙම ක්‍රමය වඩා හොඳ, සරල හා වඩා ගැලපෙන බව මට හැඟේ. ඉහත සරල උදාහරණයේ දී (සහ සාමාන්‍යයෙන් බොහෝ පොදු අවස්ථාවන්හිදී) ඔබට EditTextඅවධානය යොමු වී ඇති / ඇති අතර එය සාමාන්‍යයෙන් යතුරුපුවරුව ආයාචනා කළ තැනැත්තා විය (එය අනිවාර්යයෙන්ම බොහෝ දෙනෙකුට එය ආයාචනා කළ හැකිය පොදු අවස්ථා). එලෙසම, යතුරුපුවරුව මුදා හැරීම එය විය යුතුය, සාමාන්‍යයෙන් එය කළ හැක්කේ a ImeAction. EditTextසමඟ android:imeOptions="actionDone"හැසිරෙන ආකාරය බලන්න , ඔබට අවශ්‍ය වන්නේ එකම හැසිරීම එකම ආකාරයකින් සාක්ෂාත් කර ගැනීමයි.


මෙම අදාළ පිළිතුර පරීක්ෂා කරන්න


මෙය පිළිතුරයි. හරස් අනුවාදය ක්‍රියාත්මක වන ක්‍රමය පමණි. මෙම පිළිතුර පළ කිරීම සඳහා මම නැවත මෙම ප්‍රශ්නයට පැමිණියේ වෙනත් කිසිවෙකු දැන
නොසිටි

මෙය නිවැරදි පිළිතුර විය යුතුය. යතුරුපුවරුව සැබවින්ම තිබිය යුතු විට එය සැඟවීමට ඇන්ඩ්‍රොයිඩ් රැවටීම වෙනුවට, අපි එය පරිශීලකයා විසින් සිදු කර ඇති බව පවසන අතර, එමඟින් පරිශීලකයා යතුරුපුවරුවේ "DONE" ක්ලික් කළ ආකාරයටම එම ImeAction [මෝඩ නම, මම පිළිගනිමි]. . පරිශීලකයා යතුරුපුවරුවේ ආදානය තහවුරු කරන්නේ නම් හෝ UI බොත්තම තට්ටු කරන්නේ නම් මේ ආකාරයෙන් කිසිදු වෙනසක් සිදු නොවේ.
ඔලිවර් හෝස්ලර්

46

මෙය ක්‍රියාත්මක විය යුතුය:

public class KeyBoard {

    public static void show(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }

    public static void hide(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    }

    public static void toggle(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm.isActive()){
            hide(activity); 
        } else {
            show(activity); 
        }
    }
}

KeyBoard.toggle(activity);

යතුරුපුවරුව සැඟවී තිබුණද අර්ධ වශයෙන් වැඩ කරන ලදි, "isActive ()" ආපසු වැරදියි!
xpto

ඇත්තෙන්ම එය සිදු වේ. නැත්නම් සමහර විට මට ඔබව තේරෙන්නේ නැහැ. කෙසේ වෙතත්, ඔබ සමඟ පන්ති ආදේශ කළ හැකිය hide()සහ show()ක්රම එය පෙන්විය විට නොව යුතු විට වැඩි පාලනයක් ඇති කිරීම. මා වෙනුවෙන් වැඩ කරයි, මම එයද කළෙමි :) මම උදාහරණය සංස්කරණය කරමි
slinden77

@ යූෂා අලායුබ් ඔව්. KeyBoard.toggle(fragment.getActivity())
slinden77

ind slinden77, lol, මම මේ කතා කරන්නේ ඔබේ පිළිතුර ගැනයි ... ඔබ අදහස් දැක්වූයේ මෙය නොවේ. එබැවින් එම පිළිතුර තවමත් ක්‍රියාත්මක නොවේ.
යූෂා අලෙයූබ්

@YoushaAleayoub අහ් ඔව්. මුල් ප්‍රශ්නයේ කොටස් සඳහන් නොවේ, ඔබ තමයි කොටස් සඳහන් කළේ. එබැවින් මගේ පිළිතුර සම්පූර්ණයෙන්ම වලංගු වේ. කොටස් සමඟ එය භාවිතා කිරීම සඳහා Fragment, අදහස් දැක්වීමක් වැනි ක්‍රමයට වඩා වෙනස් ආකාරයකින් අමතන්න . කරුණාකර ක්‍රම භාවිතා කරන්නේ කෙසේදැයි ඉගෙන ගෙන නැවත එන්න. ඔබේ මෝඩ පිළිතුරු වලින් ඔබ මිනිසුන් ව්‍යාකූල කරයි
slinden77

43

හෙක්ස් අංකයක් ඇතුළත් කිරීමට මම අභිරුචි යතුරුපුවරුවක් භාවිතා කරමි, එබැවින් මට IMM යතුරුපුවරුව පෙන්විය නොහැක ...

V3.2.4_r1 setSoftInputShownOnFocus(boolean show)හි කාලගුණය පාලනය කිරීම සඳහා හෝ පෙළ දර්ශනයකට අවධානය යොමු වූ විට යතුරුපුවරුව ප්‍රදර්ශනය නොකිරීමට එකතු කරන ලදි, නමුත් එය තවමත් සැඟවී ඇති බැවින් පරාවර්තනය භාවිතා කළ යුතුය:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

පැරණි අනුවාදයන් සඳහා, මම ඉතා හොඳ ප්‍රති results ල ලබා ගත්තෙමි (නමුත් පරිපූර්ණ නොවේ) OnGlobalLayoutListener, ViewTreeObserverමගේ මූල දර්ශනයෙන් a ආධාරයෙන් එකතු කර යතුරුපුවරුව මේ ආකාරයෙන් පෙන්වන්නේ දැයි පරීක්ෂා කරන්න:

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

මෙම අන්තිම විසඳුම මඟින් තත්පරයට බෙදීම සඳහා යතුරුපුවරුව පෙන්විය හැකි අතර තේරීම් හසුරුවලින් අවුල් විය හැක.

යතුරුපුවරුවේ සම්පූර්ණ තිරයට ඇතුළු වූ විට, onGlobalLayout කැඳවනු නොලැබේ. එය වළක්වා ගැනීම සඳහා, TextView # setImeOptions (int) හෝ TextView XML ප්‍රකාශනයේ භාවිතා කරන්න:

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

යාවත්කාලීන කිරීම: යතුරුපුවරුව කිසි විටෙකත් පෙන්වීමට භාවිතා නොකරන දෙබස් සොයාගෙන ඇති අතර සියලු අනුවාද වල ක්‍රියා කරයි:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

ඔබට ස්තුතියි. FLAG_ALT_FOCUSABLE_IM සහ FLAG_ALT_FOCUSABLE_IM යන ධජ දෙක ඇත්ත වශයෙන්ම මගේ නඩුවට උදව් වූ එකම දෙයයි. මගේ ක්‍රියාකාරකම තුළ යතුරුපුවරුවක් පෙන්වීමට මට අවශ්‍ය නොවීය - පරිශීලකයා සංස්කරණ පෙළක් ක්ලික් කළ විට පවා නොවේ. (මම මගේම "යතුරු පෑඩ්" සාදන ලදී).
ඩැනියෙල් නොවාක්

සිසිල් විසඳුම, කෙසේ වෙතත්, ඔබගේ ඉදිරිපස ක්‍රියාකාරිත්වය පූර්ණ තිරයක් නොමැති නම්, යතුරුපුවරුව පිටුපසින් පෙනේ. යතුරුපුවරුවේ කර්සරය චලනය කිරීමේ ආධාරය ද තවමත් දැකිය හැකිය. එය සම පැහැපත් නොවේ.
හැල්ක්සිනේට් කරන්න

මම එය දෙවනුව. හැකි සෑම ආකාරයකින්ම getWindow (). SetFlags () ක්‍රමය ක්‍රියාත්මක වන්නේ අවම වශයෙන් ඇන්ඩ්‍රොයිඩ් 5.1 තොගයේ ය. SetSoftInputShownOnFocus () දැන් setShowSoftInputOnFocus () ලෙස සකසා ඇති අතර එය තවදුරටත් සැඟවී ඇති නමුත් ක්‍රියා නොකරයි, අවම වශයෙන් පරිශීලකයා ක්ෂේත්‍රය ස්පර්ශ කරන විට නොවේ.
olefevre

ඔබගේ "යාවත්කාලීන කිරීම" මට වැඩ කරන එකම විසඳුම විය. මම අවම වශයෙන් පැය දෙකක්වත් විසඳුමක් සොයමි :)
ස්ටෙෆාන් බ්‍රෙන්ඩ්ල්

33
public void setKeyboardVisibility(boolean show) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(show){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }else{
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    }
}

30

ත්‍රෙඩ් එකේ පළ කර ඇති සියලුම විසඳුම් හරහා මම දින දෙකකට වඩා වැඩ කර ඇති අතර ඒවා එක් ආකාරයකින් හෝ වෙනත් ආකාරයකින් නොමැති බව මට පෙනී ගොස් ඇත. මගේ නිශ්චිත අවශ්‍යතාව වන්නේ 100% විශ්වසනීයත්වයක් සහිත බොත්තමක් තිබීම හෝ තිරයේ යතුරු පුවරුව සැඟවීමයි. යතුරුපුවරුව එහි සැඟවුණු තත්වයේ පවතින විට, පරිශීලකයා ක්ලික් කරන ආදාන ක්ෂේත්‍ර කුමක් වුවත් නැවත දර්ශණය නොවිය යුතුය. පරිශීලකයා ක්ලික් කරන බොත්තම් කුමක් වුවත් යතුරුපුවරුව අතුරුදහන් නොවිය යුතුය. මෙය නවතම උපාංග දක්වාම ඇන්ඩ්‍රොයිඩ් 2.2+ මත වැඩ කිරීමට අවශ්‍ය වේ.

මගේ යෙදුම පිරිසිදු ආර්පීඑන් තුළ මෙය ක්‍රියාත්මක කිරීම ඔබට දැක ගත හැකිය .

විවිධ දුරකථන ගණනාවක (ෆ්‍රෝයෝ සහ ජින්ජර් බ්‍රෙඩ් උපාංග ඇතුළුව) යෝජිත පිළිතුරු බොහොමයක් පරීක්ෂා කිරීමෙන් පසුව, ඇන්ඩ්‍රොයිඩ් යෙදුම් විශ්වාසදායක ලෙස කළ හැකි බව පැහැදිලි විය:

  1. යතුරු පුවරුව තාවකාලිකව සඟවන්න. පරිශීලකයෙකු නව පෙළ ක්ෂේත්‍රයක් වෙත අවධානය යොමු කරන විට එය නැවත දිස්වනු ඇත.
  2. ක්‍රියාකාරකමක් ආරම්භ වන විට යතුරුපුවරුව පෙන්වන්න සහ ක්‍රියාකාරකම් මත ධජයක් සකසන්න, ඒවා යතුරුපුවරුව සැමවිටම දෘශ්‍යමාන විය යුතු බව අඟවයි. මෙම ධජය සැකසිය හැක්කේ ක්‍රියාකාරකමක් ආරම්භ කරන විට පමණි.
  3. යතුරුපුවරුව භාවිතා කිරීමට කිසි විටෙකත් පෙන්වීමට හෝ ඉඩ නොදීමට ක්‍රියාකාරකමක් සලකුණු කරන්න. මෙම ධජය සැකසිය හැක්කේ ක්‍රියාකාරකමක් ආරම්භ කරන විට පමණි.

මට නම්, යතුරු පුවරුව තාවකාලිකව සැඟවීම පමණක් ප්‍රමාණවත් නොවේ. සමහර උපාංගවල නව පෙළ ක්ෂේත්‍රයක් කේන්ද්‍රගත වූ වහාම එය නැවත දිස්වනු ඇත. මගේ යෙදුම එක් පිටුවක බහු පෙළ ක්ෂේත්‍ර භාවිතා කරන බැවින්, නව පෙළ ක්ෂේත්‍රයක් නාභිගත කිරීමෙන් සැඟවුණු යතුරුපුවරුව නැවත උත්පතන වීමට හේතු වේ.

අවාසනාවට ලැයිස්තුවේ 2 සහ 3 අයිතමයන් වැඩ කරන්නේ විශ්වසනීයත්වයක් පමණි. ක්‍රියාකාරකම දර්ශනය වූ පසු ඔබට ස්ථිරවම සැඟවීමට හෝ යතුරු පුවරුව පෙන්විය නොහැක. උපක්‍රමය නම් පරිශීලකයා යතුරුපුවරු ටොගල් බොත්තම එබූ විට ඔබේ ක්‍රියාකාරකම නැවත ආරම්භ කිරීමයි. මගේ යෙදුමේ පරිශීලකයා ටොගල් යතුරුපුවරු බොත්තම එබූ විට, පහත කේතය ක්‍රියාත්මක වේ:

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

මෙය වර්තමාන ක්‍රියාකාරකම එහි තත්වය මිටියක් තුළට සුරැකීමට හේතු වන අතර පසුව ක්‍රියාකාරීත්වය ආරම්භ වන අතර එය බූලියන් හරහා ගමන් කරමින් යතුරු පුවරුව පෙන්විය යුතුද නැතිනම් සැඟවිය යුතුද යන්න දක්වයි.

OnCreate ක්‍රමය තුළ පහත කේතය ක්‍රියාත්මක වේ:

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

මෘදු යතුරුපුවරුව පෙන්විය යුතු නම්, යතුරු පුවරුව පෙන්වන ලෙස InputMethodManager වෙත පවසන අතර මෘදු ආදානය සැමවිටම දෘශ්‍යමාන වන ලෙස කවුළුවට උපදෙස් දෙනු ලැබේ. මෘදු යතුරුපුවරුව සැඟවිය යුතු නම්, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM සකසා ඇත.

ඇන්ඩ්‍රොයිඩ් 2.2 ධාවනය වන අවුරුදු 4 ක් වයසැති එච්ටීසී දුරකථනයක සිට නෙක්සස් 7 දක්වා 4.2.2 දක්වා ධාවනය කර ඇති සියලුම උපාංගවල මෙම ප්‍රවේශය විශ්වාසදායක ලෙස ක්‍රියාත්මක වේ. මෙම ප්‍රවේශය සමඟ ඇති එකම අවාසිය නම් පසුපස බොත්තම හැසිරවීමේදී ඔබ ප්‍රවේශම් විය යුතුය. මගේ යෙදුමට අත්‍යවශ්‍යයෙන්ම ඇත්තේ එක් තිරයක් පමණි (එහි කැල්කියුලේටරය) මට onBackPressed () අභිබවා ගොස් උපාංග මුල් තිරයට ආපසු යා හැකිය.


1
යතුරුපුවරුව සැඟවීමට වස්තූන් දහස් ගණනක් ප්‍රතිනිර්මාණය කිරීම ඕනෑවට වඩා වැඩියැයි මම සිතමි. ඇන්ඩ්‍රොයිඩ් සඳහා IMM නිර්මාණය කළේ කවුරුන්දැයි මම නොදනිමි, නමුත් එය වින්ඩෝස් ඒපී මෙන් සුවඳයි. මගේ මතය අනුව, හොඳ IME එකකට ක්‍රම දෙකක් තිබිය යුතුය: සැඟවී පෙන්වන්න :-)
rupps

ඒ සියල්ල සත්‍යය, නමුත් මගේ ක්‍රියාකාරිත්වයට එක් වාසියක් ඇත - එය සැමවිටම ක්‍රියාත්මක වේ! යූඅයි හි කුමන ක්ෂේත්‍රවල අවධානය යොමු වී ඇත්ද, පරිශීලකයා ටොගල් කිරීමට සහ යතුරුපුවරුව කුමක් කර ඇත්ද සහ ඒවා ක්‍රියාත්මක වන්නේ කුමන ඇන්ඩ්‍රොයිඩ් සංස්කරණයද යන්න නොසලකා සෑම විටම යතුරුපුවරුව ටොගල් කරන වෙනත් විසඳුමක් නොමැත: - \
ලූක් ස්ලීමන්

මචං, මම යතුරුපුවරුව සැඟවීමට මුළුමනින්ම මංමුලා සහගතයි. දේවල් දහස් ගණනක් උත්සාහ කළ අතර නූන් වැඩ කරයි. නමුත් ඔබේ ක්‍රියාකාරිත්වය මට වැඩියි, මට කොටස් 10 ක් වැනි ප්‍රතිනිර්මාණය කිරීමට, සේවාවන් ආරම්භ කිරීමට, දුර්වල යොමු කිරීම් මකා දැමීමට මට සිදුවේ .... ඔබ දන්නවාද? ග්‍රාම නිලධාරීවරයා 25mb: S වැනි ඉවතලනු ඇත ... තවමත් එය කිරීමට විශ්වාසදායක ක්‍රමයක් සොයමින් සිටී :(
rupps

It දිමිත්‍රි හොඳයි එය හෙලෝ ලෝකයක් නොවේ ... එය ටැබ්ලට් සඳහා සංකීර්ණ යෙදුමකි. මෝඩ යතුරුපුවරුවක් සැඟවීම සඳහා එය මතකයෙන් මුළුමනින්ම මුදා හැරීම මම ප්‍රතික්ෂේප කරමි ... කෙසේ හෝ මෙහි යෝජනා කර ඇති විසඳුම් දහසක් ඒකාබද්ධ කරමින් ක්‍රියා කරන යමක් මට හමු විය :)
rupps

27

මේ සියලු විසඳුමට විකල්පයක් ලෙස , යතුරුපුවරුව විවෘත කිරීම සඳහා භාවිතා කළ (සංස්කරණ ටෙක්ස්ට්) ක්ෂේත්‍රය ගැන සඳහනක් නොමැතිව මෘදු යතුරුපුවරුව ඕනෑම තැනකින් වසා දැමීමට ඔබට අවශ්‍ය නම් , නමුත් ක්ෂේත්‍රය කේන්ද්‍රගත වී ඇත්නම් එය කිරීමට අවශ්‍ය නම්, ඔබට භාවිතා කළ හැකිය මෙය (ක්‍රියාකාරකමකින්):

if (getCurrentFocus() != null) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

25

මෙම SO පිළිතුරට ස්තූතියි , මම පහත දැක්වෙන දේ ව්‍යුත්පන්න කර ඇති අතර, මගේ නඩුවේදී, ViewPager හි කොටස් හරහා අනුචලනය කිරීමේදී එය හොඳින් ක්‍රියාත්මක වේ ...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}

21

ඉහත පිළිතුරු විවිධ අවස්ථා සඳහා ක්‍රියා කරයි, නමුත් ඔබට යතුරුපුවරුව දර්ශනයක් තුළ සැඟවීමට අවශ්‍ය නම් සහ නිවැරදි සන්දර්භය ලබා ගැනීමට වෙහෙසෙන්නේ නම් මෙය උත්සාහ කරන්න:

setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        hideSoftKeyBoardOnTabClicked(v);
    }
}

private void hideSoftKeyBoardOnTabClicked(View v) {
    if (v != null && context != null) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

සහ සන්දර්භය ලබා ගැනීම සඳහා එය ඉදිකිරීම්කරුගෙන් ලබා ගනී :)

public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}

18

ඒකකයක් හෝ ක්‍රියාකාරී පරීක්ෂණයක් අතරතුර මෘදු යතුරු පුවරුව වැසීමට ඔබට අවශ්‍ය නම්, ඔබේ පරීක්ෂණයෙන් "පසුපස බොත්තම" ක්ලික් කිරීමෙන් ඔබට එය කළ හැකිය:

// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

ඉහත සඳහන් onBackPressed()ක්‍රියාකාරකම් සඳහා ක්‍රියාකාරීත්වය අවුලුවන්නේ නැති නිසා මම "පසුපස බොත්තම" උපුටා දැක්වීම් වලට දැමුවෙමි . එය යතුරු පුවරුව වසා දමයි.

ඉදිරියට යාමට පෙර ටික වේලාවක් විරාමයක් තබා ගැනීමට වග බලා ගන්න, පසුපස බොත්තම වැසීමට මඳ වේලාවක් ගත වන බැවින්, පසුව දර්ශන, යනාදී ක්ලික් කිරීම් කෙටි විරාමයකින් පසුව ලියාපදිංචි නොවනු ඇත (තත්පර 1 ක් දිගු ප්‍රමාණවත් වේ ).


16

ඇන්ඩ්‍රොයිඩ් සඳහා මොනෝ හි ඔබ එය කරන ආකාරය මෙන්න (AKA MonoDroid)

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);

1
කුමක්ද searchboxමේ ඇබිත්ත දී?
PCoder

16

සියලු විකාර යතුරුපුවරු හැසිරීම් සඳහා මෙය මට වැඩ කළේය

private boolean isKeyboardVisible() {
    Rect r = new Rect();
    //r will be populated with the coordinates of your view that area still visible.
    mRootView.getWindowVisibleDisplayFrame(r);

    int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
    return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}

protected void showKeyboard() {
    if (isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (getCurrentFocus() == null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    } else {
        View view = getCurrentFocus();
        inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }
}

protected void hideKeyboard() {
    if (!isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View view = getCurrentFocus();
    if (view == null) {
        if (inputMethodManager.isAcceptingText())
            inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
    } else {
        if (view instanceof EditText)
            ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
        inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

1
හිතන්න මම මේකට කලින් පිළිතුරු 10 ක් උත්සාහ කළා. බලාපොරොත්තුව අත්හැරියා. ස්තූතියි මචං.
බොලිං

MRootView යනු කුමක්ද?
justdan0227

14

android:windowSoftInputMode="stateHidden"මැනිෆෙස්ට් ගොනුවේ ඔබගේ ක්‍රියාකාරකමට එක් කරන්න . උදාහරණයක්:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>

14

සරල හා භාවිතයට පහසු ක්‍රමයක්, සැඟවුණු පුවරුව අමතන්න (YourActivity.this); යතුරු පුවරුව සැඟවීමට

/**
 * This method is used to hide keyboard
 * @param activity
 */
public static void hideKeyboardFrom(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

13

ඔබගේ ක්‍රියාකාරකම් වලදී මෙම ප්‍රශස්ත කේතය භාවිතා කරන්න:

if (this.getCurrentFocus() != null) {
    InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

හොඳින් වැඩ කරයි. ස්තූතියි
අලිෆ්

12
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

onTouchListener වෙත ඇමතුමෙන් පසුව:

findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Utils.hideSoftKeyboard(activity);
        return false;
    }
});

මෙයද උත්සාහ කරන්න - මෙය මා වෙනුවෙන් වැඩ කළේය: InputMethodManager imm = ((InputMethodManager) getSystemService (Activity.INPUT_METHOD_SERVICE)); imm.hideSoftInputFromWindow (getWindow (). getCurrentFocus (). getWindowToken (), 0);
zmicer


12

විවෘත යතුරුපුවරුව සඳහා:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edtView, InputMethodManager.SHOW_IMPLICIT);

යතුරුපුවරුව වැසීමට / සඟවන්න සඳහා:

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

12

මගේ නඩුව සඳහා, මම ක්‍රියාකාරී තීරුවේ සෙවුම් දසුනක් භාවිතා කරමින් සිටියෙමි. පරිශීලකයෙකු සෙවීමක් කළ පසු, යතුරුපුවරුව නැවත විවෘත වේ.

InputMethodManager භාවිතා කිරීම යතුරු පුවරුව වසා නැත. මට ෆෝකස් ඉවත් කර සෙවුම් දර්ශනයේ අවධානය යොමු කළ හැකි දේ අසත්‍ය ලෙස සැකසීමට සිදු විය:

mSearchView.clearFocus();
mSearchView.setFocusable(false);

1
හරිම දක්ෂයි. පරිශීලකයාට වෙනත් සෙවුමක් අවශ්‍ය නම්, නැවත සෙවීම ක්ලික් කරන්න.
ඇලෙක්ස්

සෙවුම් දසුනට clearFocus()ඇන්ඩ්‍රොයිඩ් ඒපීඅයි පිටුවල නොමැත, එබැවින් මෙය මට වැඩ කළේ නැත, නමුත් තවත් විසඳුමක් ලබා දුන්නේය (පහත මගේ පිළිතුර බලන්න).
අසුරෙස්පොට්


12

මට නඩුව තිබේ, එහිදී මගේ EditTextස්ථානයද ස්ථානගත කළ හැකිය AlertDialog, එබැවින් යතුරු පුවරුව සේවයෙන් ඉවත් කළ යුතුය. පහත කේතය ඕනෑම තැනක වැඩ කරන බව පෙනේ:

public static void hideKeyboard( Activity activity ) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
    View f = activity.getCurrentFocus();
    if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
        imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
    else 
        activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}

1
සැඟවීමට සොෆ්ට්ඉන්පුට් ෆ්‍රොම් වින්ඩෝ () ක්‍රමයට පරාමිතියක් ලෙස කුමන සංස්කරණ පා pass ය පාලනය කිරීමට ඔබට අවශ්‍ය නැති නිසා මෙම විසඳුම වඩා හොඳය. ඒක නියමයි !!
බිලීජෝකර්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.