2011-12-18 66 views
7

编辑使用的WebView和RelativeLayout的时候: 这里的显示问题视频:www.youtube.com/watch?v=5ZZsuMH5T9k我真的被困在这里:/奇怪的行为在全屏

-

我有它由一个活动一个webview和一个按钮在底部。我设置了活动的窗口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); 

    // ... 
} 

的问题是,大部分时间 web视图似乎“推”按钮关闭屏幕。下面是截图:

wrong

larger version

我希望看到(和有时我)在这里:

correct

larger version

这里是

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

我也注意到,如果你使用的系统设置中关闭所有的动画在设备上,这个问题就没了(:我使用的(请注意,我的应用程序上的布局已经是一个RelativeLayout的)布局虽然当整个视图有一个顶部边距然后它跳回到正确的位置时会出现这个故障)。

有没有人遇到类似的问题,并知道如何解决它?

+1

你可以发布'onCreate()' – 2011-12-21 05:22:18

+0

你正在测试设备或模拟器? – 2011-12-21 06:49:49

+0

你可以发布你的代码吗?标题栏中是否需要进度对话框? 'Window.FEATURE_PROGRESS'应该和'setProgressBarVisibility(true)'一起使用,或者如果你不想使用进度条,就不要使用它。如果你想隐藏标题栏,那么你可以使用'android:windowNoTitle' – 2011-12-21 17:22:44

回答

0

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

它应该给一个更好的结果。

+0

谢谢,但它确实必须是RelativeLayout。 – 2011-12-21 20:29:20

+1

而不是指定机制,为什么不指定你需要达到的结果。你能解释一下设计约束是否会导致非RelativeLayout解决方案不可行? – Sparky 2011-12-21 20:44:26

+0

如果将WebView设置为alignParentTop而不是layout_above,它会工作吗?该视图将能够延伸到按钮后面,而不是将它推下... – Jave 2011-12-22 09:39:46

0

要隐藏我用的标题栏:

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

测试上的Galaxy S 2(安卓2.3.3)和华为U8180 X1(安卓2.2.2),并与相对布局工作的罚款。

从屏幕截图中可以看出问题在于您所要求的进度指示器不完整。关闭动画时问题消失的事实也支持这一理论。

+0

谢谢,实际上我使用的setFlags与FLAG_FULLSCREEN只是没有在错误中将它包含在问题中。我尝试删除FEATURE_PROGRESS,但它没有帮助。 – 2011-12-21 20:30:10

+0

什么版本的Android和您正在测试什么设备? 你有没有看到LinearLayout的奇怪行为?我仍然相信坏屏幕上的黑色方块与布局没有任何关系,但却是一半的标题或通知栏。 – 2011-12-22 13:01:46

0

你可以试试这个。顶部布局仍然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> 

LinearLayoutWebView占据整个窗口(和父母)的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(); 

    } 
1

我只是增加了一个按钮,Hello WebView教程,一切似乎看的权利。然后我将main.xmlLinearLayout转换为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

对于相对布局android:layout_above =“@ + id/mainbtn”将不起作用,因为您在该代码下面定义了buttion – Dharmendra 2011-12-23 05:27:04

+0

我不能说它是否可以工作,但它确实有效。我在运行Android 1.6,2.3和4.0的设备上进行了测试。 – Sparky 2011-12-23 18:11:31

1

尝试对齐web视图到父顶部,并对齐按钮到母体底部是web视图下方。我发现,如果没有真正的原因,如果元素不是以线性顺序排列在一起,而是固定在屏幕的顶部或底部,那么这些元素的排列不正确。

我认为你不是重写onMeasure()方法,并改变按钮的测量高度。在开发我的应用程序时,我通过在布局阶段错误计算元素的高度而创建了大量(太多)的错误,并且花费了几个小时来苦苦寻找布局定义代码,以发现它很好,但高度计算是将无效数据提供给布局的渲染阶段。

+0

看来,这不是布局错位的问题。就好像框架认为由于通知栏的动画消失,整个窗口更小。 – 2012-01-18 15:28:22

0

请参考以下链接:

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

下载项目文件(.zip)。

导入它,让我知道这个项目是否有任何帮助。

+0

我不明白这会有什么帮助。我的情况与您在项目中的情况完全不同。 – 2012-01-18 15:26:03

+0

在这个项目中,编辑文本和按钮位于webView的上方,只需在webView下面调整它们:) – 2012-01-19 09:42:31

0

下面的代码可能会帮助你,

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

不,这没有帮助。 – 2012-01-18 15:24:03