2012-04-22 20 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番目の呼び出しは実際にサイズを設定するに過ぎないと思います。だから、私はリスナーを削除しないことに決めました(2回呼び出された場合、それはパフォーマンス・キラーではありません)。永久的なボトムバーをクリックするたびに呼び出されて、ツールバーの外観が表示されるようになるまで、それは問題ないと思われました。レイアウトを設定してからサイトをロードするので、毎回リロードされています。また、ビューのサイズが正しい場合にのみサイトをロードする必要があります。これは、サーバーがコンテンツを送信するため、指定されたサイズに対して特別に最適化されているためです。

私はリスナーを離れることができないため、それを削除する必要があります。でもいつ?ちょうど2に数えますか?それはすべてのデバイス/ Androidバージョンで動作しますか?なぜ2番目の呼び出しでは動作しますが、最初の呼び出しでは機能しませんか?

よろしく、

答えて

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()の呼び出しは1つでは不十分です。インスタンスを削除すると、インスタンスは機能しなくなります。私は決してそれを取り除くべきかどうか決定するために呼び出される頻度を見出そうとします。 (そして、もし私がそうしなければならないのなら、おそらく、左/上/右/下が既に私が望んでいるもので、すぐにではない)。 – noober

+0

とにかく、それは働くので、もう一度ありがとう。 – noober

+0

これは2回だけ呼ばれています。リスナーを離れてもいいと思います。 – noober

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

+0

何らかの方法で問題を解決しましたか? –

+0

うん、私はOnGlobalLayoutListenerからレイアウトを行い、それは動作します。詳細はblessenmの答えを見てください。 – noober

関連する問題