2012-04-22 136 views
0

我有以下XML:Android webview佈局 - 何時設置位置?

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/rl" 
    android:background="@color/red" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <WebView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/webview" 
     android:layout_width="10dp" 
     android:layout_height="10dp" /> 
</RelativeLayout> 

當我打電話:

view.layout(50, 50, 1024 - 50, 600 - 50); 

從的onCreate()和在onStart(),它沒有任何效果。但是,當我將相同的調用添加到shouldOverrideKeyEvent()並按下一個鍵時,它可以工作。我想這是因爲我的設置正在被XML的設置覆蓋。所以,問題是:我應該在什麼時候儘快調用layout(),但在android:layout_width =「10dp」和android:layout_height =「10dp」之後已經應用了。

UPDATE

我用blessenm的解決方案。

private class LayoutListener implements OnGlobalLayoutListener 
{ 
    public void onGlobalLayout() 
    { 
     Display display = getWindowManager().getDefaultDisplay(); 
     int screenWidth = display.getWidth(); 
     int screenHeight = display.getHeight(); 

     // Workaround for a 'fill_parent' bug on my tablet (Kindle Fire). 
     _WebView.layout(0, 0, screenWidth, screenHeight); 
     _WebView.loadUrl("http://192.168.1.2"); 
     //_Layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    } 
} 

如果我評論removeGlobalOnLayoutListener()出,它停止工作。調試器顯示它被調用兩次,所以我想第二次調用實際上只是設置了大小。所以,我決定不刪除這個監聽器(如果它被稱爲2次,那不是性能殺手)。它似乎沒問題,直到我意識到這是每當我點擊一個永久的底部條形圖時,就會引起工具條的出現。由於我在設置佈局之後加載了一個網站,因此每次都會重新加載。我只有在視圖的大小正確時才加載站點,因爲服務器發送的內容是針對給定大小進行了特別優化的。

這就是爲什麼我不能離開聽衆,應該刪除它。但當?數到2?它可以在任何設備/ Android版本上運行嗎?爲什麼它在第二個電話中工作,但不是第一個電話?

問候,

回答

2

我認爲它是因爲onCreate事件的佈局沒有被抽中或測量呢。因此,如果您嘗試在該事件中調用佈局,則不會產生影響。嘗試把你的代碼放入viewtreeobserver中,它可能會工作。

添加到您的活動的onCreate

ViewTreeObserver vto  = layout.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     view.layout(50, 50, 1024 - 50, 600 - 50); 
     layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    } 
}); 

這裏佈局可以是你的父母或外佈局。

+0

謝謝。看起來你的代碼中有2個錯誤。 1.(明顯的一個)監聽器是接口,而不是類,你必須實現onGlobalLayout(),而不是覆蓋它。註釋是不需要的。 2.我不知道爲什麼,但onGlobalLayout()的一個調用是不夠的。如果刪除實例,它將停止工作。我會試着找出它被調用的頻率來決定,我應該刪除它。 (如果我應該那麼,也許,當左/上/右/底已經是我想要的,而不是立即)。 – noober 2012-04-22 11:41:40

+0

無論如何,它的工作,所以再次感謝你。 – noober 2012-04-22 11:44:50

+0

它只被調用兩次。我認爲離開聽衆是可以的。 – noober 2012-04-22 12:00:55

4
WebView webview = (WebView)findViewById(R.id.webview); 
MarginLayoutParams marginsParams = new MarginLayoutParams(webview.getLayoutParams()); 
marginsParams.setMargins(50, 50,1024-50, 600-50); 
RelativeLayout.LayoutParams lp = new LayoutParams(marginsParams); 
webview.setLayoutParams(lp); 

試試這個代碼::::

+0

不幸的是,我不明白如何處理佈局參數。我嘗試了onCreate中的代碼,無濟於事。 – noober 2012-04-22 11:49:19

+0

任何方式解決您的問題? – 2012-04-22 11:51:57

+0

是的,我從OnGlobalLayoutListener做佈局,它的工作原理。有關詳細信息,請參閱blessenm的答案。 – noober 2012-04-22 12:04:26