Отображение рекламы поверх программной клавиатуры

Я только что интегрировал AdWhirl в свое приложение. У меня настроено представление AdWhirl для отображения в нижней части макета моей основной деятельности. У меня есть несколько полей EditText на моем основном макете, и когда приложение впервые запускается, щелкая текстовые поля, обычно отображается программная клавиатура. Однако, когда я перехожу к другому действию и возвращаюсь к своему основному действию, затем нажимаю EditText, появляется экранная клавиатура с представлением AdWhirl сверху, закрывающим мое поле EditText. Я боролся с этим в течение нескольких дней. Любая помощь будет оценена по достоинству.

У меня есть android:windowSoftInputMode="adjustPan", определенный в моем манифесте для всех действий.

Вот мой макет main.xml:

<RelativeLayout android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">

<ImageView android:id="@+id/ImageView02"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:background="@drawable/other_bg_small" android:layout_weight="1"/>

<ImageView android:id="@+id/ImageView01"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:background="@drawable/banner" android:layout_alignParentTop="true" 
    android:paddingBottom="30dip"/>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:stretchColumns="1" android:gravity="center"        android:id="@+id/table01"
    android:layout_below="@id/ImageView01" >

     ... Table stuff
</TableLayout>

<LinearLayout android:layout_width="fill_parent"
    android:id="@+id/ad_layout" android:layout_height="wrap_content"
    android:gravity="bottom" android:layout_alignParentBottom="true"
    android:layout_alignBottom="@+id/RelativeLayout01" android:layout_weight="1">

    <com.adwhirl.AdWhirlLayout android:id="@+id/adwhirl_layout"
        android:layout_width="fill_parent" android:layout_height="wrap_content"/>

</LinearLayout>

 </RelativeLayout>

person Jeremy Henderson    schedule 19.04.2011    source источник


Ответы (2)


Попробуйте установить onFocusChangeListener в поля EditText. Когда они получают фокус, установите видимость представления AdWhirl на View.INVISIBLE, чтобы оно не закрывало текстовые поля, а затем снова установите видимость после потери фокуса.

final AdWhirl ad = (AdWhirl)findViewById(R.id.adwhirlAd);
        EditText et = (EditText)findViewById(R.id.editTextBox);
        et.setOnFocusChangeListener(new OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {

                ad.setVisibility(hasFocus ? View.INVISIBLE : View.VISIBLE);

            }
        });
person Joe    schedule 19.04.2011
comment
Кажется, это помогает, единственная проблема в том, что у меня есть 2 поля EditText, и если я реализую ваше решение для каждого из них, объявление никогда не будет отображаться... - person Jeremy Henderson; 19.04.2011
comment
Попробуйте установить его программно, используя getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); в вашем onCreate. - person Joe; 19.04.2011
comment
Я думаю, это сработало! Спасибо! Интересно, почему атрибут manifest не прикреплялся... - person Jeremy Henderson; 19.04.2011
comment
@ Джо, я думаю, что твой последний комментарий должен быть твоим ответом. - person Adrián Pérez; 24.06.2013
comment
Я согласен, последний комментарий Джо здесь должен быть ответом. - person S bruce; 25.01.2017

Я попытался установить android:windowSoftInputMode="adjustPan". он скрывает баннер AdMob но и EdiText. Я также попробовал принятый ответ, но текст редактирования может получить фокус без открытия клавиатуры. Итак, решение, которое я нашел, — скрыть баннер AdMob при открытии клавиатуры. Я научился определять, открывается ли клавиатура здесь. и вот мое решение:

final View activityRootView = findViewById(R.id.sample_main_layout);
            activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
                    if (heightDiff > Support.dpToPx(MainActivity.this, 200)) { // if more than 200 dp, it's probably a keyboard...
                        mAdView.setVisibility(View.GONE);
                    }
                    else{
                        mAdView.setVisibility(View.VISIBLE);
                    }
                 }
            });
person bat-el.g    schedule 06.11.2016
comment
Что такое Support.dpToPx? - person Yesudass Moses; 22.09.2018