Как скрыть рекламный баннер при открытой клавиатуре на Android

Я использую MoPubView для рекламы в своем приложении. Но когда я открываю клавиатуру, этот баннер поднимается и закрывает виджеты.

введите здесь описание изображения

Это код из макета:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/material_bg">

    <ScrollView
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingBottom="@dimen/activity_horizontal_margin">

            ...Content here
        </LinearLayout>



    </ScrollView>

    <com.mopub.mobileads.MoPubView
        android:id="@+id/adview"
        android:layout_width="fill_parent"
        android:layout_height="@dimen/mopub_height"
        android:layout_gravity="bottom"/>
</FrameLayout>

Эта схема этого макета: введите здесь описание изображения

Как скрыть этот баннер или закрепить его внизу?


person Artem    schedule 10.09.2015    source источник
comment
Я думаю, что этот ответ может помочь вам. проверьте это: stackoverflow.com/a/26176575/2943501   -  person Milad Nouri    schedule 10.09.2015
comment
Это кажется самым элегантным решением: stackoverflow.com/a/26176575/438466   -  person Rabi    schedule 10.04.2016


Ответы (3)


Создайте класс для обработки обнаружения клавиатуры,

import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;

import java.util.LinkedList;
import java.util.List;

public class SoftKeyboardStateWatcher implements ViewTreeObserver.OnGlobalLayoutListener {

    public interface SoftKeyboardStateListener {
        void onSoftKeyboardOpened(int keyboardHeightInPx);
        void onSoftKeyboardClosed();
    }

    private final List<SoftKeyboardStateListener> listeners = new LinkedList<SoftKeyboardStateListener>();
    private final View activityRootView;
    private int        lastSoftKeyboardHeightInPx;
    private boolean    isSoftKeyboardOpened;

    public SoftKeyboardStateWatcher(View activityRootView) {
        this(activityRootView, false);
    }

    public SoftKeyboardStateWatcher(View activityRootView, boolean isSoftKeyboardOpened) {
        this.activityRootView     = activityRootView;
        this.isSoftKeyboardOpened = isSoftKeyboardOpened;
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    @Override
    public void onGlobalLayout() {
        final Rect r = new Rect();
        //r will be populated with the coordinates of your view that area still visible.
        activityRootView.getWindowVisibleDisplayFrame(r);

        final int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
        if (!isSoftKeyboardOpened && heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
            isSoftKeyboardOpened = true;
            notifyOnSoftKeyboardOpened(heightDiff);
        } else if (isSoftKeyboardOpened && heightDiff < 100) {
            isSoftKeyboardOpened = false;
            notifyOnSoftKeyboardClosed();
        }
    }

    public void setIsSoftKeyboardOpened(boolean isSoftKeyboardOpened) {
        this.isSoftKeyboardOpened = isSoftKeyboardOpened;
    }

    public boolean isSoftKeyboardOpened() {
        return isSoftKeyboardOpened;
    }

    /**
     * Default value is zero {@code 0}.
     *
     * @return last saved keyboard height in px
     */
    public int getLastSoftKeyboardHeightInPx() {
        return lastSoftKeyboardHeightInPx;
    }

    public void addSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
        listeners.add(listener);
    }

    public void removeSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
        listeners.remove(listener);
    }

    private void notifyOnSoftKeyboardOpened(int keyboardHeightInPx) {
        this.lastSoftKeyboardHeightInPx = keyboardHeightInPx;

        for (SoftKeyboardStateListener listener : listeners) {
            if (listener != null) {
                listener.onSoftKeyboardOpened(keyboardHeightInPx);
            }
        }
    }

    private void notifyOnSoftKeyboardClosed() {
        for (SoftKeyboardStateListener listener : listeners) {
            if (listener != null) {
                listener.onSoftKeyboardClosed();
            }
        }
    }
}

В метод onCreate вашей AdActivity вставьте следующие строки:

final SoftKeyboardStateWatcher softKeyboardStateWatcher = new SoftKeyboardStateWatcher(findViewById(R.id.container);
        // Add listener
        softKeyboardStateWatcher.addSoftKeyboardStateListener(new SoftKeyboardStateWatcher.SoftKeyboardStateListener() {
                @Override
                public void onSoftKeyboardOpened(int keyboardHeightInPx) {

                }

                @Override
                public void onSoftKeyboardClosed() {

                }
            });
        // then just handle callbacks
person Arsal Imam    schedule 10.09.2015
comment
@Asal Imam - привет, спасибо, но - joxi.ru/ZrJVlnVh4jwkrj - какой идентификатор я должен указать здесь? Если у меня есть много виджетов (EditText) для ввода - нужен ли один слушатель клавиатуры для каждого текста редактирования? - person Artem; 10.09.2015
comment
Вам не нужно устанавливать SoftKeyboardStateWatcher для каждого виджета...! Вам просто нужно установить только идентификатор макета... Вам нужен пример...? - person Arsal Imam; 10.09.2015
comment
@АртемШевченко ....! Я обновил ответ, теперь вам не нужно менять идентификатор, просто используйте его так же..... - person Arsal Imam; 10.09.2015
comment
Ты получил желаемые результаты, брат...? - person Arsal Imam; 10.09.2015
comment
Я проверяю это. Не работает - когда я запускаю рекламу Activity, видимость ИСКЛЮЧАЕТСЯ, даже если я не открываю клавиатуру. ((( - person Artem; 10.09.2015
comment
Я пробую это - не работает (я пытаюсь использовать все идентификаторы - но не работает). Когда активность началась, я вижу тост OPEN (я добавляю Toast.makeText(...)) в onSoftKeyboardOpened(), но тогда этого не происходит ( - person Artem; 14.09.2015

Используйте приведенный ниже код, если вы не хотите показывать рекламу

 adView.destroy();
 adView.setVisibility(View.GONE);

Изменить: попробуйте использовать это:

  android:windowSoftInputMode="adjustPan";

в вашем манифесте для этой деятельности

person Ashish Shukla    schedule 10.09.2015
comment
Мне нужно показывать рекламу для пользователей. Если я его уничтожу - пользователи не увидят рекламу ( - person Artem; 10.09.2015
comment
вы можете просто установить его видимость на GONE, когда вы не хотите, а затем установить на VISIBLE, когда вы хотите показать свое объявление - person Ashish Shukla; 10.09.2015
comment
Да, но я не хочу показывать рекламу, когда клавиатура открыта. Это запрос прослушивания открытия/закрытия клавиатуры. - person Artem; 10.09.2015

Решил эту проблему, добавив

android:windowSoftInputMode="настроитьPan"

в AndroidManifest.xml

<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="adjustPan"
android:theme="@style/AppTheme.NoActionBar"> 
</activity>
person aihalapathirana    schedule 24.12.2017