Добавить собственный вид нижнего колонтитула в веб-просмотр

У меня есть WebView и собственное собственное представление, которое я хочу добавить под WebView. Я пытался обернуть WebView внутри ScrollView, и хотя это делает именно то, что я хочу, производительность прокрутки действительно отстает, и если пользователь прокручивает прокрутку, касаясь экрана, не останавливает прокрутку, как должно.

Другой подход, о котором я думал, заключался в том, чтобы раздуть WebView в оболочку FrameLayout с моим представлением нижнего колонтитула поверх WebView, затем каким-то образом увеличить высоту WebView, чтобы приспособить размер нижнего колонтитула, подтолкнуть представление нижнего колонтитула к концу высоты WebViews, а затем следите за прокруткой WebView, чтобы перемещать нижний колонтитул вместе с ним.

Я настроил базовый класс, моя проблема заключается в расширении прокручиваемого содержимого в WebView, а затем в перемещении нижнего колонтитула в нижнюю часть содержимого WebViews; основная проблема заключается в том, что WebView не является типичным представлением для Android, а содержимое страницы загружается асинхронно (и, следовательно, размер содержимого изменяется).

Как я могу расширить прокручиваемый контент WebView? И как я могу установить собственный нижний колонтитул ниже содержимого WebView?

РЕДАКТИРОВАТЬ:

На самом деле я не использую xml, представление построено в коде следующим образом:

public class WebViewWithFooter extends FrameLayout {

private ObservableWebView mWebView;//webview with scroll methods overridden for access
private FrameLayout mFooterContainer;

public WebViewWithFooter(Context context) {
    super(context);
    init();
}


public WebViewWithFooter(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}


public WebViewWithFooter(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public WebViewWithFooter(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init();
}


private void init() {

    FrameLayout.LayoutParams footerParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
    FrameLayout.LayoutParams webviewParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    mWebView = new ObservableWebView(getContext());

    mFooterContainer = new FrameLayout(getContext());

    addView(mWebView, webviewParams);
    addView(mFooterContainer, footerParams);
}
}

person AndroidNoob    schedule 06.07.2015    source источник
comment
не могли бы вы показать свой макет xml?   -  person eduyayo    schedule 06.07.2015
comment
отредактировал код выше с моим классом (нет xml, поскольку он построен в коде)   -  person AndroidNoob    schedule 06.07.2015
comment
возможно, вы можете подумать о создании своей пользовательской группы представлений, задачей которой является компоновка веб-представления и нижнего колонтитула. Я чувствую, что если вы хотите точно контролировать то, как вы описали, лучше всего сделать макет самостоятельно.   -  person Helin Wang    schedule 08.07.2015


Ответы (4)


Оберните простой Webview с нижним колонтитулом (LinearLayout, RelativeLayout и т. д.) внутри ObservableScrollView, а не ObservableWebView. Я не могу вдаваться в подробности, так как вы не добавили никаких файлов макета.

ИЗМЕНИТЬ:

Activity.xml:

<LinearLayout   
   android:layout_width="match parent"  
   android:layout_height="match parent"  
   android:orientation="vertical">  
   <com.github.ksoichiro.android.observablescrollview.ObservableScrollView
           android:id="@+id/viewObj" 
           android:layout_width="match parent"  
           android:layout_height="wrap_content">
    <!-- Webview and footer programatically added here -->
    </com.github.ksoichiro.android.observablescrollview.ObservableScrollView
</LinearLayout> 

Activity.java:

FrameLayout.LayoutParams footerParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
FrameLayout.LayoutParams webviewParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);

mWebView = new WebView(getContext());
mFooterContainer = new FrameLayout(getContext());

mObservableScrollView = (ObservableScrollView) findViewbyId(R.id.viewObj);
mObservableScrollView.addView(mWebView, webviewParams);
mObservableScrollView.addView(mFooterContainer, footerParams);
person xyz    schedule 08.07.2015
comment
Если бы вы правильно прочитали вопрос, вы бы увидели, что я уже пробовал и тестировал обертывание веб-просмотра и нижнего колонтитула в прокрутке, и пока это работает, производительность прокрутки очень медленная, поэтому мой запрос на другой подход - person AndroidNoob; 09.07.2015
comment
Да я это видел. Из частичного кода я понял, что вы используете ObservableWebView и прикрепляете обратные вызовы. Вместо этого прикрепите свои обратные вызовы к ObservableScrollView. - person xyz; 09.07.2015
comment
ScrollView может содержать только один прямой дочерний элемент - person francisco_ssb; 20.04.2018

Я достиг этого, используя XML-код макета следующим образом:

    <TextView
        android:id="@+id/about_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:textAppearanceMedium"
        />

    <TextView
        android:id="@+id/readme_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/changelog_text" />
    <WebView
        android:id="@+id/readme_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:scrollbarAlwaysDrawVerticalTrack="true"
        android:scrollbars="vertical" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_gravity="center_horizontal"
        android:orientation="horizontal">

        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:layout_weight="0.5" />

        <cu.tellistico.ImageButtonText
            android:id="@+id/btn_gift"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"

            android:contentDescription="@string/btn_donate_info"
            custom:buttonBackground="@drawable/states_orange"
            android:src="@drawable/ic_gift"
            android:text="Donar"
            android:textColor="@color/text_orange" />

        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:layout_weight="0.5"/>
    </LinearLayout>

</LinearLayout>

Под синим текстом находится прокручиваемый веб-просмотр и нижний колонтитул кнопки. Это действительно для вас?

person Roberto Tellez Ibarra    schedule 13.07.2015

Если я вас правильно понял, вы пытаетесь показать/скрыть нижний колонтитул при прокрутке WebView, верно? Если это так, я не думаю, что для этого вам нужна сторонняя библиотека. Вы можете расширить WebView и переопределить метод onScrollChanged(). Вызывается при изменении горизонтальной или вертикальной прокрутки. Если вертикальная прокрутка изменилась и она положительная, покажите футер, иначе - скройте.

Еще одна идея: пробовали ли вы новую библиотеку дизайна, поставляемую Google? Есть удобный способ добиться такого поведения для ListView или RecyclerView.

person Kiril Aleksandrov    schedule 15.07.2015

Поправьте меня, если я ошибаюсь, но в основном вы хотите, чтобы ваш нижний колонтитул был внизу страницы, а ваш веб-просмотр занимал все оставшееся пространство?

Почему бы вам просто не поместить свой нижний колонтитул в RelativeLayout с alignParentBottom, установленным в true, а затем ваш WebView будет над вашим пользовательским представлением с высотой, установленной на matchParent?

person DDsix    schedule 15.07.2015