Веб-просмотр не загружается при надувании - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над приложением с панелью навигации, которая может отображать несколько экранов. Все эти страницы отображаются в пределах одного и того же Activity, но надуваются в обертку.

<android.support.design.widget.CoordinatorLayout 
    //some parameters 

    <include
        android:id="@+id/main_container"
        layout="@layout/content_main" />

</android.support.design.widget.CoordinatorLayout>

Один из этих экранов содержит WebView.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/webview_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/app_bar_main">


    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>

К веб-представлению я прикрепляю WebViewClient для обработки некоторых HTML-манипуляций с Javascript.

WebView webView = findViewById(R.id.web_view);
if (webView == null) {
    inflateLayout(R.layout.layout_with_webview);
    webView = findViewById(R.id.web_view);
}
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new CustomWebViewClient());
webView.loadUrl("http://www.somesite.com");

Если я добавлю WebView в макет, который загружается с setContentView(), когда начинается действие, все загружается правильно. После этого я надуваю другой макет в main_container, используя следующий код:

public void inflateLayout(int toinflate) {
    ConstraintLayout mainLayout = findViewById(R.id.main_container);
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(toinflate, null);
    mainLayout.removeAllViews();
    mainLayout.addView(layout);
    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
}

Когда я теперь хочу накачать макет, содержащий WebView, при вызове webView.loadUrl("some url") ничего не отображается, хотя вызывается метод onPageFinished(...).

Теперь вопрос: что я делаю не так и как я могу использовать WebViews, которые прикреплены к экрану, используя инфляцию.

Также: я уже пытался добавить WebView, используя addView, и он не работал.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/webview_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/app_bar_main">


    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>

Родительским макетом является ConstraintLayout, в то время как дочерний компонент, т.е. webView, на самом деле не имеет допустимых свойств. Сначала проверьте этот макет в режиме предварительного просмотра. Можете ли вы увидеть в нем свое веб-представление? если нет, попробуйте это -

<WebView
      android:id="@+id/web_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintBottom_toBottomOf="parent"/>
0 голосов
/ 27 апреля 2018

Вам нужно повторно инициализировать новые раздутые ссылки на макеты

public void inflateLayout(int toinflate) {
    ConstraintLayout mainLayout = findViewById(R.id.main_container);
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(toinflate, null);
    mainLayout.removeAllViews();
    mainLayout.addView(layout);

   // you need to reinitialise the web view which will refer to 
   // the web view in newly inflated layout as
   webView = findViewById(R.id.web_view);
   webView.getSettings().setJavaScriptEnabled(true);
   webView.setWebViewClient(new CustomWebViewClient());

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
}

потому что новое связанное представление не имеет связи с существующим макетом действия, следовательно, веб-представление загружается нормально, но не будет влиять на экран

Инфляция дорогая, поэтому эффективный вариант - Фрагменты


Обновление: : Надутый макет должен иметь соответствующий параметр макета в соответствии с макетом ограничения, поэтому используйте

View layout = inflater.inflate(toinflate, mainLayout);
...