Странное поведение при использовании WebView и RelativeLayout в полноэкранном режиме - PullRequest
7 голосов
/ 18 декабря 2011

EDIT: Вот видео, показывающее проблему: www.youtube.com / watch? V = 5ZZsuMH5T9k Я действительно застрял здесь: /

-

У меня есть активность, которая состоит из веб-просмотра и кнопки внизу. Я установил окно активности на полный экран, используя этот код в onCreate:

@Override
public void onCreate(Bundle savedInstanceState) {
  InstaFetchApplication.applyCurrentTheme(this);

  super.onCreate(savedInstanceState);

  getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  requestWindowFeature(Window.FEATURE_PROGRESS);

  if (UserPreferences.getIsFullScreenReadingEnabled(this)) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // this just do this: window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    ActivityUtils.toggleFullScreen(this, true);
  }

  setContentView(R.layout.view_article);

  // ...
}

Проблема в том, что большую часть времени веб-просмотр, кажется, "нажимает" кнопку за пределами экрана. Вот скриншот:

wrong

( увеличенная версия )

То, что я ожидал бы увидеть (а иногда я делаю), здесь:

correct

( увеличенная версия )

Вот макет, который я использую (обратите внимание, что в моем приложении верхний макет должен быть RelativeLayout):

<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/layout_test"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
>
  <Button
    android:id="@+id/button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:text="Click me!"
  />
  <WebView
    android:id="@+id/web_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@id/button"
  />
</RelativeLayout>

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

Кто-нибудь сталкивался с подобной проблемой и знает, как ее исправить?

Ответы [ 8 ]

2 голосов
/ 18 января 2012

Наконец я нашел ответ.Добавление WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS флага к окну решило мою проблему.

Смотрите этот пост: flag_fullscreen + windowNoTitle == ошибка фокуса кнопки .

1 голос
/ 24 декабря 2011

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

Я предполагаю, что вы не переопределяете метод onMeasure () и не изменяете измеренную высоту кнопки.Я создал множество (слишком много) ошибок во время разработки моих приложений, неправильно рассчитав высоту элемента на этапе макета, и потратил часы, пытаясь отладить код определения макета, только чтобы убедиться, что он в порядке, но вычисление высоты былоподача неверных данных в фазу рендеринга макета.

1 голос
/ 22 декабря 2011

Я только что добавил кнопку в учебник Hello WebView , и все, похоже, выглядит правильно.Затем я преобразовал main.xml из LinearLayout в RelativeLayout, и все, кажется, все еще выглядит правильно.Я думаю, что вы делаете вещи слишком сложными.:-) Попробуйте удалить большую часть кода инициализации из onCreate() и просто указать его в XML.

Вот мой проект.

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.hellowebview"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".HelloWebViewActivity"
            android:label="@string/app_name" 
            android:theme="@android:style/Theme.NoTitleBar"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

HelloWebViewActivity.java:

package com.example.android.hellowebview;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class HelloWebViewActivity extends Activity {

    WebView mWebView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_rl);

        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.setWebViewClient(new HelloWebViewClient());
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.loadUrl("http://www.google.com");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }
}

main_ll.xml (LinearLayout):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
    />
    <Button
        android:id="@+id/mainbtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="@string/btn_label"
    />
</LinearLayout>

main_rl.xml (RelativeLayout):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/mainbtn"
    />
    <Button
        android:id="@+id/mainbtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@string/btn_label"
    />
</RelativeLayout>

strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="hello">Hello World, HelloWebViewActivity!</string>
    <string name="app_name">HelloWebView</string>
    <string name="btn_label">Push Me</string>

</resources>
0 голосов
/ 18 января 2012

код ниже может помочь вам,

    webView = (WebView) findViewById(R.id.webview1);
    webView.setInitialScale(100);

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
            view.scrollTo(0, 0);

        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            view.loadDataWithBaseURL(null, yourdata, "text/html", "utf-8", null);
            // view.loadUrl(url);
            return true;
        }
    });


webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        try {
            //your stuff
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}
0 голосов
/ 18 января 2012

Пожалуйста, перейдите по этой ссылке:

http://marakana.com/forums/android/examples/58.html

Загрузите файл проекта (.zip).

Импортируйте его и сообщите, если этот проектлюбая помощь.

0 голосов
/ 22 декабря 2011

Вы можете попробовать это.Верхний макет по-прежнему RelativeLayout, единственное отличие с вашим - LinearLayout оборачивает все:

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

>
<LinearLayout android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  android:weightSum="1">
  <WebView

      android:id="@+id/web_view"
      android:layout_width="fill_parent"
      android:layout_height="0px"
      android:layout_weight=".90" />


</LinearLayout>
</RelativeLayout>

В LinearLayout, WebView занимает 90% всего окна (и родитель) и оставшаяся кнопка 10%.Высота установлена ​​на 0px для обоих, поэтому вес может сделать работу для них обоих.Стоимость анализа этого xml незначительна.

А в коде Java я сделал:

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


       getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
       requestWindowFeature(Window.FEATURE_NO_TITLE);
        requestWindowFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main);
        LinearLayout mLinearLayout = (LinearLayout)findViewById(R.id.ll);
        Button mButton = new Button(this);
        LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 0, 0.10f);
        mButton.setText("Click me!");
        mButton.setLayoutParams(mParams);
        mLinearLayout.addView(mButton);
        mLinearLayout.invalidate();

    }
0 голосов
/ 21 декабря 2011

Чтобы скрыть строку заголовка, я использую:

getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

Протестировано на Galaxy S 2 (Android 2.3.3) и Huawei U8180 X1 (Android 2.2.2) и отлично работало с вашим относительным макетом.

Из скриншота складывается впечатление, что проблема скорее в том, что вы указали индикатор неполного прогресса. Тот факт, что проблема исчезает при отключении анимации, также поддерживает эту теорию.

0 голосов
/ 21 декабря 2011

Если RelativeLayout не является абсолютно необходимым, Вы можете изменить на LinearLayout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <WebView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="I'm a button"/>
</LinearLayout>

. Это должно дать лучший результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...