2011-12-06 4 views
6

カスタムViewGroupを作成しようとしており、フルスクリーンアプリケーションで使用したいと考えています。私は "requestWindowFeature(Window.FEATURE_NO_TITLE)"を使ってタイトルバーを隠しています。タイトルバーは表示されませんが、ウィンドウの上部にはまだスペースが必要です。それは私のためにこのスペースを与えているアンドロイドであることを見るのは興味深いですAndroid:カスタムViewGroupでFEATURE_NO_TITLEを使用すると、ウィンドウ上部にスペースが残る

public class CustomLayoutTestActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     Button b = new Button(this); 
     b.setText("Hello"); 
     CustomLayout layout = new CustomLayout(this); 
     layout.addView(b); 
     setContentView(layout); 
    } 
} 

public class CustomLayout extends ViewGroup { 
    public CustomLayout(Context context) { 
     super(context); 
    } 
    public CustomLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public CustomLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 
    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     Log.i("CustomLayout", "changed="+changed+" l="+l+" t="+t+" r="+r+" b="+b); 
     final int childCount = getChildCount(); 
     for (int i = 0; i < childCount; ++i) { 
      final View v = getChildAt(i); 
      v.layout(l, t, r, b); 
     } 
    } 
} 

The full Eclipse project is here

Here is a picture of the problem

上記の画像は、次のコードで生成されましたカスタムレイアウト。私は自分のアクティビティのルートレイアウトとしてCustomLayoutを設定しています。 Log in "onLayout"は "t = 25"を受信して​​います。これが私のレイアウトを押し下げています。私が知らないことは、Androidを「t = 25」(これはタイトルバーの高さと同じです)にすることに間違っています。

Android SDK 2.1でこのコードを実行していますが、Android 2.2でも発生します。


EDIT:私はいくつかのデフォルトのレイアウト(などのLinearLayoutなど)のためにCustomLayoutクラスを変更する場合は、スペースが消えます。もちろん、Android SDKのデフォルトのレイアウトは作成しようとしているレイアウトを作成しないので、作成しています。

私が作成しているレイアウトはやや複雑ですが、これは私が自分のレイアウトに持っている問題を再現するために作成できる最小のコードです。

答えて

3

これは、完全な答えではないのですが、その間に、あなたはまた、それはあなたのレイアウトは、画面の下部を超えて延びていることは注目に値します<FrameLayout />

にカスタムレイアウトをラップすることにより、この問題を回避することができます。それは、タイトルバーの高さ(私のエミュレータでは38ピクセル)でシフトダウンされました

編集:それを得ました。 onLayout()(および対応するlayout()メソッド)は、座標が画面の原点からの相対座標ではなく、親座標(http://developer.android.com/reference/android/view/View.html#layout%28int,%20int,%20int,%20int%29)との相対座標であることを指定します。あなたは相対座標(0,38)にあり、それをあなたの子供に渡すときにそれを追加しています。つまり、あなたの子供はスクリーン座標(0、 76)、ギャップを生じさせる。あなたが実際に何をしたいのか

は次のとおりです。

v.layout(0, 0, r - l, b - t); 

あなたのビューと同じ幅と高さで、あなたのビューの左上隅に合わせ、あなたの子ビューを置くこと。

+0

android:layout_gravity="top"を追加することによってそれを修正FrameLayout 2.2で

と同じ問題を持っていたが、@Hounshell、ありがとうございました。私は座標系が親に対して相対的であるということについて、この点をドキュメント上で見逃していました。これは私が(あなたのコメントの結果)達成したいものの写真です:[リンク](http://i.imgur.com/FIOIG) – lgfischer

0

私はFrameLayout

関連する問題