2011-12-18 5 views
7

EDIT: Dưới đây là đoạn video cho thấy các vấn đề: www.youtube.com/watch?v=5ZZsuMH5T9k Tôi thực sự bị mắc kẹt ở đây:/hành vi kỳ lạ khi sử dụng WebView và RelativeLayout trong toàn màn hình

-

Tôi có một hoạt động trong đó bao gồm một webview và một nút ở phía dưới. Tôi thiết lập các cửa sổ hoạt động để toàn màn hình sử dụng mã này trong 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); 

    // ... 
} 

Vấn đề là phần lớn thời gian webview dường như "đẩy" nút tắt màn hình. Dưới đây là ảnh chụp màn hình:

wrong

(larger version)

Những gì tôi mong chờ để xem (và đôi khi tôi làm) là ở đây:

correct

(larger version)

Đây là bố trí Tôi đang sử dụng (lưu ý rằng trong ứng dụng của tôi cách bố trí hàng đầu phải là một 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> 

Tôi cũng nhận thấy rằng nếu bạn tắt tất cả các hình ảnh động trên thiết bị sử dụng cài đặt hệ thống, vấn đề này đã biến mất (mặc dù có trục trặc này khi toàn bộ khung nhìn có lề trên và sau đó nó nhảy trở lại vị trí chính xác).

Có ai gặp phải sự cố tương tự và biết cách khắc phục sự cố không?

+1

bạn có thể đăng 'onCreate()' –

+0

Bạn đang thử nghiệm trên thiết bị hoặc trình giả lập không? –

+0

Bạn có thể đăng mã của mình không? Bạn có cần hộp thoại tiến trình trong thanh tiêu đề không? 'Window.FEATURE_PROGRESS' nên được sử dụng với' setProgressBarVisibility (true) 'hoặc không được sử dụng nếu bạn không muốn thanh tiến trình.Nếu bạn đang tìm cách ẩn thanh tiêu đề thì bạn có thể sử dụng 'android: windowNoTitle' –

Trả lời

0

Trừ khi RelativeLayout là hoàn toàn cần thiết, Bạn có thể thay đổi sang một 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> 

Nó sẽ cho một kết quả tốt hơn.

+0

Cảm ơn nhưng nó thực sự phải là RelativeLayout. –

+1

Thay vì chỉ định cơ chế, tại sao không chỉ định kết quả bạn cần đạt được. Bạn có thể giải thích ràng buộc thiết kế nào khiến các giải pháp không phải là RelativeLayout không khả thi? – Sparky

+0

Tính năng này có hoạt động nếu bạn đặt WebView của mình thành alignParentTop thay vì layout_above không? Xem sẽ có thể mở rộng phía sau nút hơn là đẩy nó xuống ... – Jave

0

Để ẩn thanh tiêu đề tôi sử dụng:

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

Tested trên Galaxy S 2 (Android 2.3.3) và Huawei U8180 X1 (Android 2.2.2) và làm việc tốt với cách bố trí tương đối của bạn.

Từ ảnh chụp màn hình Tôi có ấn tượng rằng vấn đề nằm đúng với chỉ báo tiến trình chưa hoàn tất mà bạn yêu cầu. Thực tế là vấn đề biến mất khi tắt các hình động cũng hỗ trợ lý thuyết này.

+0

Cảm ơn, thực sự tôi đang sử dụng setFlags với FLAG_FULLSCREEN chỉ không bao gồm nó trong câu hỏi do nhầm lẫn. Tôi đã thử xóa FEATURE_PROGRESS nhưng không hiệu quả. –

+0

Phiên bản Android nào và bạn đang thử nghiệm thiết bị nào? Bạn đã bao giờ thấy hành vi lạ với LinearLayout chưa? Tôi vẫn tin rằng hình vuông màu đen trên đầu trang của ảnh chụp màn hình xấu không có gì để làm với bố cục nhưng là một nửa tiêu đề kết xuất hoặc thanh thông báo. –

0

Bạn có thể thử điều này. Cách bố trí hàng đầu vẫn là RelativeLayout, sự khác biệt duy nhất với bạn là LinearLayout được gói lên tất cả mọi thứ:

<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> 

Trong LinearLayout, WebView chiếm 90% của toàn bộ cửa sổ (và mẹ) và nút còn lại 10%. Chiều cao được đặt là 0px cho cả hai, vì vậy trọng lượng có thể thực hiện công việc cho cả hai. Chi phí cho việc phân tích cú pháp xml này là không đáng kể.

Và trong mã Java Tôi đã làm:

@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(); 

    } 
1

Tôi chỉ cần thêm một nút để các Hello WebView hướng dẫn, và tất cả mọi thứ dường như nhìn bên phải. Sau đó, tôi đã chuyển đổi main.xml từ LinearLayout thành RelativeLayout và mọi thứ dường như vẫn ổn. Tôi nghĩ bạn đang làm mọi thứ quá phức tạp. :-) Hãy thử xóa hầu hết mã khởi tạo đó khỏi onCreate() và chỉ định nó trong XML.

Đây là dự án của tôi.

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

Đối với bố cục tương đối android: layout_above = "@ + id/mainbtn" sẽ không hoạt động vì bạn đã xác định buttion bên dưới mã đó – Dharmendra

+0

Tôi không thể nói liệu nó có hoạt động hay không, nhưng nó hoạt động. Tôi đã thử nghiệm nó trên các thiết bị chạy Android 1.6, 2.3 và 4.0. – Sparky

1

Cố gắng sắp xếp các view web lên đỉnh phụ huynh, và sắp xếp các nút để phụ huynh đáy là dưới xem web. Tôi đã tìm thấy thời gian khi, không có lý do thực sự, các yếu tố không hoàn toàn xếp hàng một cách chính xác nếu họ không phải là tất cả các strung với nhau trong một chuỗi tuyến tính hoặc neo ở trên cùng hoặc ở dưới cùng của màn hình.

Tôi giả sử rằng bạn không ghi đè phương thức onMeasure() và thay đổi chiều cao đo được của nút. Tôi đã tạo ra rất nhiều lỗi (quá nhiều) trong quá trình phát triển các ứng dụng bằng cách tính toán chiều cao của một phần tử trong giai đoạn bố trí và đã mất hàng giờ để gỡ lỗi mã định nghĩa bố cục chỉ để thấy rằng nó ổn, nhưng tính toán chiều cao là cho ăn dữ liệu không hợp lệ vào giai đoạn dựng hình của bố cục.

+0

Dường như đây không phải là vấn đề không đúng trong bố cục. Nó giống như khuôn khổ nghĩ rằng toàn bộ cửa sổ nhỏ hơn do hoạt hình của thanh thông báo biến mất. –

0

Vui lòng tham khảo liên kết này:

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

Tải (.zip) tập tin dự án.

Nhập mã và cho tôi biết nếu dự án này có bất kỳ trợ giúp nào không.

+0

Tôi không thấy điều này sẽ giúp ích gì. Tình hình của tôi hoàn toàn khác với những gì bạn đang có trong dự án của mình. –

+0

Trong dự án này, văn bản chỉnh sửa và nút nằm phía trên webView, chỉ cần điều chỉnh chúng bên dưới webView :) –

0

mã dưới đây có thể giúp bạn,

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

Không, điều này không hữu ích. –