Ці ёсць спосаб у андроіды, каб атрымаць вышыню віртуальнай клавіятуры прылады

Ці ёсць спосаб у андроіды, каб атрымаць вышыню віртуальнай клавіятуры андроіда прылады падчас выканання. На самай справе я хачу, каб паказаць тэкставае поле над клавіятурай.

29
Аналагічнае пытанне тут :)
дададзена аўтар Oli, крыніца
але гэта было прапанавана 2 гады таму. Можа быць ёсць нейкае рашэнне ў цяперашні час.
дададзена аўтар Zeeshan Mirza, крыніца

8 адказы

Я перакаштаваў шмат прапанаваных метадаў для гэтага, але ніхто, здавалася, не працаваць на Android SDL. Я думаю, што гэта альбо таму, што SDL дысплей «поўны экран», або што ён сядзіць унутры «AbsoluteLayout» і, такім чынам, вышыня «Від» ніколі не мяняецца. Гэты метад працуе для мяне:

Атрыманне памераў мяккай клавіятуры

mRootWindow = getWindow();
mRootView = mRootWindow.getDecorView().findViewById(android.R.id.content);
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
    public void onGlobalLayout(){
        Rect r = new Rect();
        View view = mRootWindow.getDecorView();
        view.getWindowVisibleDisplayFrame(r);
       //r.left, r.top, r.right, r.bottom
    }
    });
28
дададзена
о Божухна! какой каштоўны камень я знайшоў :)
дададзена аўтар rupps, крыніца
Выдатна! Гэта працуе для adjustPan.
дададзена аўтар drakeet, крыніца
Дзякуй за гэты адказ, менавіта тое, што мне было трэба. Гэта працуе для разліку на экране памер клавіятуры без adjustResize (які я не хачу).
дададзена аўтар Alexey Yakovenko, крыніца
Гэта выдатны адказ. Лоўрэнс вы @ Dave варта згадаць у адказ што гэта вышыня Прастакутнік ў не прымае да ўвагі радок стану.
дададзена аўтар Ari, крыніца
Як разлічыць вышыню клавіятуры ад гэтага метаду?
дададзена аўтар Ali, крыніца
Не працуе з «adjustNothing»
дададзена аўтар Sharm, крыніца

Так, вы можаце, з дапамогай Viewtree назіральніка і глабальнага размяшчэння слухача, паспрабуйце ніжэйпаказаныя крокі

  1. Атрымаць выгляд каранёвай макеце
  2. атрымаць назіральнік Viewtree для гэтага кораня, і дадаць глабальны макет слухача на вяршыні гэтага.

Зараз адлюстроўваецца кожны раз, калі экранная клавіятура Android будзе змяніць памер экрана, і вы атрымаеце выклік на слухача. Вось гэта адзінае, што вам цяпер трэба зрабіць, гэта разлічыць розніцу паміж вышынёй, якая на ваш погляд корань пасля паўторнага памеру і зыходнага памеру. Калі розніца складае больш за 150 разглядаць гэта як клавіятура была завышаная.

Ніжэй прыведзены прыклад кода

root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
     public void onGlobalLayout(){
           int heightDiff = root.getRootView().getHeight()- root.getHeight();
          //IF height diff is more then 150, consider keyboard as visible.  
        }
  });

З павагай, Techfist

27
дададзена
Heightdiff дасць вам колькасць прасторы клавіятуры паглынаецца.
дададзена аўтар Techfist, крыніца
яго ў піксель ...
дададзена аўтар Techfist, крыніца
Ці з'яўляецца гэтая вышыня ў пікселях або пп?
дададзена аўтар Ali Shah Ahmed, крыніца
гэта проста атрымлівае Ці ці не паказаны на клавіятуры, але гэта не дае вам вышыню клавіятуры.
дададзена аўтар what is sleep, крыніца
Але калі мы патрабуем «adjustNothing», то гэты код не можа быць карысна ....
дададзена аўтар NehaK, крыніца
я думаю, што гэта працуе толькі, калі АНДРОІД: windowSoftInputMode = «adjustResize»
дададзена аўтар Jacky, крыніца
І Android: windowSoftInputMode = «adjustResize» павінны быць змешчаны ў актыўнасці атрыбуцыі ў AndroidMainfest, дзе была выкарыстаная ваша экранная клавіятура.
дададзена аўтар zionpi, крыніца
150px недастаткова для xxhdpi прылад, як Nexus 5. Лепш, каб пераўтварыць гэта абсалютная значэнне пікселя ад значэння йра і выкарыстоўваць замест. Я выкарыстоўваю 120dp і што добра працуе для Nexus 7 (xhdpi) і Nexus 5 (xxhdpi). Ваш вопыт можа змяняцца, хоць ...
дададзена аўтар Thomas Keller, крыніца

Каб вырашыць гэтую праблему, я напісаў keyboardHeightProvider, які можа вылічыць вышыню плавае мяккай клавіятуры. Актыўнасць можа быць ўстаноўлена ў adjustNone або adjustPan ў AndroidManifest.xml.

https://github.com/Siebeprojects/samples-keyboardheight

Siebe

27
дададзена
10+ ідэальны браценік!
дададзена аўтар Kishore Jethava, крыніца
Дзякуй за рашэнне. Было б вельмі добра, калі вы зробіце LIB з яго.
дададзена аўтар Maksim Ostrovidov, крыніца
Гэта лепшае рашэнне ..
дададзена аўтар NehaK, крыніца
Ці ёсць Gradle залежнасць або банка даступныя ў гэтым праекце?
дададзена аўтар vijay, крыніца
Рады, што змог дапамагчы з гэтым. Крута чуць гэта добра працуе.
дададзена аўтар Siebe Brouwer, крыніца
Адзінае працоўны раствор для adjustNOTHING!
дададзена аўтар Sough, крыніца

змясціць тэкставае поле ў якасці бацькоўскага данізу.

android:layout_alignParentBottom="true"

і ў файле маніфесту зрабіць мяккі ўвод adjustresize

android:windowSoftInputMode="adjustResize"

то тэкставае поле будзе рухацца ўверх, калі з'явіцца клавіятура.

7
дададзена
У мяне ёсць меркаванне, што відэа на поўны экран, што я не хачу, каб рухацца, калі раскладка змяняе памер, але я ўсё яшчэ хачу, каб тэкставае поле для перамяшчэння і заставацца над клавіятурай. Як бы адзін выканаць гэта?
дададзена аўтар Lo-Tan, крыніца
@ Lo-Тан гэта менавіта тое, што я хачу дасягнуць, а таксама. Вы высветліць, як гэта зрабіць?
дададзена аўтар pesho, крыніца

Вы не можаце сказаць. Не, на самай справе: вы проста не можаце сказаць.

Клавіятура ня павінна быць які-небудзь канкрэтнай формы. Ён не павінен быць размешчаны ў ніжняй частцы экрана ( шмат аб найбольш папулярных варыянтаў прамавугольнае . Ён таксама можа проста ўзяць на ўвесь экран .

(Копія майго адказу на падобнае пытанне, Атрыманне памераў мяккай клавіятуры </а>)

4
дададзена

Маё рашэнне з'яўляецца спалучэнне ўсіх вышэйпералічаных рашэнняў. Гэтае рашэнне таксама Hacky, але вырашыць гэтую праблему (прынамсі для мяне).

  1. I have places on temporary view with transparent background at the bottom of the screen.
  2. I have added android:windowSoftInputMode="adjustResize" flag in activity tag in manifest like @bill suggests.
  3. Now main story is in onGlobalLayout(). There i calculate the difference between the y axis of temp view and height of root view

    final View view = findViewById(R.id.base);
    
    view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    
        @Override
        public void onGlobalLayout() {
    
            int rootViewHeight = view.getRootView().getHeight();
            View tv = findViewById(R.id.temp_view);
            int location[] = new int[2];
            tv.getLocationOnScreen(location);
            int height = (int) (location[1] + tv.getMeasuredHeight());
            deff = rootViewHeight - height;
           //deff is the height of soft keyboard
    
        }
    });
    

Але ў любым выпадку, каб вырашыць праблему @ zeeshan0026 толькі адзін сцяг у відавочным Android: windowSoftInputMode = «adjustResize» дастаткова.

0
дададзена
Калі мы выкарыстоўваем adjustNothing сцяг, то выгляд не будзе аказваць яшчэ раз, калі клавіятура адкрыта так, па-відаць onGlobalLayout не павінны тэлефанаваць, і мы не ў стане атрымаць змена памеру. Хоць я не спрабаваў сам, але гэта тое, што чакалася.
дададзена аўтар Gem, крыніца
Ці можна атрымаць вышыню клавіятуры, выкарыстоўваючы Android: windowSoftInputMode = «adjustNothing» ?
дададзена аўтар VijayRaj, крыніца

Look no more! I've been looking for a solution for this for a long time. After days of trying all the tricks suggested on SOF, I found the perfect solution that actually works.

This GitHub project demonstrates it the best way possible: https://github.com/siebeprojects/samples-keyboardheight

Весяліцца!

0
дададзена

Я выкарыстаў гэта, каб атрымаць вышыню клавіятуры праграмна ў Android і пратэставалі яго, калі ласка, паспрабуйце адзін раз:

myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                   //TODO Auto-generated method stub
                    Rect r = new Rect();
                    parent.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parent.getRootView().getHeight();
                    int heightDifference = screenHeight - (r.bottom - r.top);
                    Log.d("Keyboard Size", "Size: " + heightDifference);

                    //boolean visible = heightDiff > screenHeight/3;
                }
            });

Дзякуй.

0
дададзена
Не забывайце здабываць OnGlobalLayoutListener ўнутры зваротнага выкліку.
дададзена аўтар Adib Faramarzi, крыніца