2011-08-01 15 views
0

私は、再利用可能な数値キーボードを使ってアプリケーションを構築しています。キーボードは独自のXMLファイルに配置されているため、アプリ全体で必要な場所に組み込むことができます。現在のアクティビティの画面を、下部にある固定サイズの数値キーボードと、残りのコントロールのRelativeLayout(RL)の2つに分割したいと思います。Android - レイアウトの不一致解決に必要なヘルプ(RelativeLayoutとLinearLayout)

問題は、RLが動作していないことです。以下の例では、RLが画面全体を占め、キーボードは表示されません。本当に奇妙なのは、配置を逆にしてキーボードの上にキーボードを置くと、画面が期待通りに表示され、キーボードとRLがそれぞれ約半分を占めるということです。

つまり、キーボードが上部に含まれている場合、すべて正常です(ただし、キーボードは間違った場所にあります)。しかし、キーボードを底部に入れると、キーボードは表示されず、RLは画面全体を占有します。

ヘルプ!このような不一致が私には嫌な思いを抱かせ、私は部屋の向こう側にコンピュータを投げつける寸前です。

活動のXML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/statsTabLayout" 
    android:scaleType="fitXY" 
    android:background="#ffffff" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:baselineAligned="true" 
    android:orientation="vertical"> 

    <RelativeLayout android:id="@+id/statsTopLayout" 
     android:background="#ffffff" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:orientation="vertical"> 


    <TextView android:id="@+id/textViewTopMargin" 
     android:text="        " 
     android:textColor="#FFFFFF" 
     android:textSize = "5sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_gravity="top" 
     android:layout_alignParentLeft="true" 
     android:paddingTop="0px" 
    ></TextView> 

    <TextView android:id="@+id/textViewAverage" 
     android:text="Average = (%)" 
     android:textColor="#000000" 
     android:textSize = "25sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewTopMargin" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <Button android:id="@+id/buttonReset" 
     android:text="reset" 
     android:onClick="resetButtonClick" 
     android:textSize = "12sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/textViewAverage" 
     android:layout_alignBottom="@+id/textViewAverage" 
     android:layout_below="@+id/textViewTopMargin" 
     android:layout_alignParentRight="true" 
    ></Button> 

    <TextView android:id="@+id/textViewHi" 
     android:text="High= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewLow" 
     android:text="Low= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_centerHorizontal="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewMax" 
     android:text="Max= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_alignParentRight="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewScore" 
     android:text="Score = " 
     android:textColor="#000000" 
     android:textSize = "30sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_above="@+id/textViewScoreCalculation" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewScoreCalculation" 
     android:text="(score calculation)" 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:textStyle="italic" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="10px" 
     android:layout_above="@+id/editTextPoints" 
     android:layout_alignParentRight="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewPoints" 
     android:text="Enter Points: " 
     android:textSize = "30sp" 
     android:textColor="#000000" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/textViewBottomMargin" 
     android:layout_alignParentLeft="true" 
     android:paddingBottom="10px" 
    ></TextView> 

    <EditText android:id="@+id/editTextPoints" 
     android:text="" 
     android:digits="-." 
     android:windowSoftInputMode="stateVisible" 
     android:focusable="true" 
     android:textSize = "30sp" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/textViewPoints" 
     android:layout_alignBottom="@+id/textViewPoints" 
     android:layout_above="@+id/textViewBottomMargin" 
     android:layout_toRightOf="@+id/textViewPoints" 
     android:paddingBottom="10px" 
    ></EditText> 

    <TextView android:id="@+id/textViewBottomMargin" 
     android:text="        " 
     android:textColor="#FFFFFF" 
     android:textSize = "5sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentBottom="true" 
     android:paddingBottom="0px" 
    ></TextView> 


    </RelativeLayout> 


    <include layout="@layout/numerickeyboard" /> 

</LinearLayout> 

含まキーボードの親のレイアウト:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="104pt" 
    android:id="@+id/numberPadLayoutContainer" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:background="#404040" 
    android:layout_alignParentBottom="true" 
> 

任意の提案ですか?

答えて

0

layout_alignParentBottom="true"のようなRelativeLayoutの子レイアウトの属性の中には、そのレイアウトがそのボトムに整列させたい子をレイアウトする前に独自の寸法を決定する必要があるという問題があります。実際に、子供がalignParentBottomを要求すると、RelativeLayoutは、使用可能なすべての垂直スペースを強制的に使用します。

最後の要素の上の最後の要素であるTextView android:id="@+id/textViewBottomMargin"は、alignParentBottomと定義されています。最後の項目の上に配置するのではなく、前の項目の下に並べるように最後のいくつかの要素を変更してレイアウトを修正しました。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/statsTabLayout" 
    android:scaleType="fitXY" 
    android:background="#ffffff" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:baselineAligned="true" 
    android:orientation="vertical"> 

    <RelativeLayout android:id="@+id/statsTopLayout" 
     android:background="#ffffff" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:orientation="vertical"> 


    <TextView android:id="@+id/textViewTopMargin" 
     android:text="        " 
     android:textColor="#FFFFFF" 
     android:textSize = "5sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_gravity="top" 
     android:layout_alignParentLeft="true" 
     android:paddingTop="0px" 
    ></TextView> 

    <TextView android:id="@+id/textViewAverage" 
     android:text="Average = (%)" 
     android:textColor="#000000" 
     android:textSize = "25sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewTopMargin" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <Button android:id="@+id/buttonReset" 
     android:text="reset" 
     android:onClick="resetButtonClick" 
     android:textSize = "12sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/textViewAverage" 
     android:layout_alignBottom="@+id/textViewAverage" 
     android:layout_below="@+id/textViewTopMargin" 
     android:layout_alignParentRight="true" 
    ></Button> 

    <TextView android:id="@+id/textViewHi" 
     android:text="High= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewLow" 
     android:text="Low= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_centerHorizontal="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewMax" 
     android:text="Max= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_alignParentRight="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewScore" 
     android:text="Score = " 
     android:textColor="#000000" 
     android:textSize = "30sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewHi" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewScoreCalculation" 
     android:text="(score calculation)" 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:textStyle="italic" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="10px" 
     android:layout_below="@+id/textViewScore" 
     android:layout_alignParentRight="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewPoints" 
     android:text="Enter Points: " 
     android:textSize = "30sp" 
     android:textColor="#000000" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/textViewScoreCalculation" 
     android:layout_alignParentLeft="true" 
     android:paddingBottom="10px" 
    ></TextView> 

    <EditText android:id="@+id/editTextPoints" 
     android:text="" 
     android:digits="-." 
     android:windowSoftInputMode="stateVisible" 
     android:focusable="true" 
     android:textSize = "30sp" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/textViewPoints" 
     android:layout_alignBottom="@+id/textViewPoints" 
     android:layout_toRightOf="@+id/textViewPoints" 
     android:paddingBottom="10px" 
    ></EditText> 

    <TextView android:id="@+id/textViewBottomMargin" 
     android:text="        " 
     android:textColor="#FFFFFF" 
     android:textSize = "5sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/editTextPoints" 
     android:paddingBottom="0px" 
    ></TextView> 


    </RelativeLayout> 


    <include layout="@layout/numerickeyboard" /> 

</LinearLayout> 

また、android:layout_alignParentBottom="true"ステートメントを削除してキーボードを変更しました。

これは、HVGA_1.6エミュレータのスクリーンショットです(スクリーンショットではキーボード領域を緑色にしました)。改正質問1として

enter image description here

、「また、我々は、キーボードが含まれていないときstatsTopLayoutが画面いっぱいにしたい」(コメントを参照)、私は謙虚に、元の主にこれらの変更を提出し、キーボードレイアウトファイル:元main.xml

RelativeLayoutにルートLinearLayoutを変更し、その最初の要素であることを<include>を移動します。その中で<include>要素を移動、numerickeyboard.xmlからandroid:id="@+id/numberPadLayoutContainer"ステートメントを追加(及び(main.xmlローカルID宣言せずにコンパイルされません)numerickeyboard.xmlから削除。第3の要素は今すぐlayout_height="fill_parent"layout_above="@id/numberPadLayoutContainer"を指定囲まRelativeLayout、である。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/statsTabLayout" 
    android:background="#ffffff" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    > 

    <include layout="@layout/numerickeyboard" 
      android:id="@+id/numberPadLayoutContainer" 
     /> 

    <RelativeLayout android:id="@+id/statsTopLayout" 
     android:background="#ffffff" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" 
     android:layout_above="@id/numberPadLayoutContainer"> 


    <TextView android:id="@+id/textViewTopMargin" 
     android:text="        " 
     android:textColor="#FFFFFF" 
     android:textSize = "5sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_gravity="top" 
     android:layout_alignParentLeft="true" 
     android:paddingTop="0px" 
    ></TextView> 

    <TextView android:id="@+id/textViewAverage" 
     android:text="Average = (%)" 
     android:textColor="#000000" 
     android:textSize = "25sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewTopMargin" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <Button android:id="@+id/buttonReset" 
     android:text="reset" 
     android:onClick="resetButtonClick" 
     android:textSize = "12sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/textViewAverage" 
     android:layout_alignBottom="@+id/textViewAverage" 
     android:layout_below="@+id/textViewTopMargin" 
     android:layout_alignParentRight="true" 
    ></Button> 

    <TextView android:id="@+id/textViewHi" 
     android:text="High= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewLow" 
     android:text="Low= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_centerHorizontal="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewMax" 
     android:text="Max= " 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_below="@+id/textViewAverage" 
     android:layout_alignParentRight="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewScore" 
     android:text="Score = " 
     android:textColor="#000000" 
     android:textSize = "30sp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="5px" 
     android:layout_above="@+id/textViewScoreCalculation" 
     android:layout_alignParentLeft="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewScoreCalculation" 
     android:text="(score calculation)" 
     android:textColor="#000000" 
     android:textSize = "20sp" 
     android:textStyle="italic" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="10px" 
     android:layout_above="@+id/editTextPoints" 
     android:layout_alignParentRight="true" 
    ></TextView> 

    <TextView android:id="@+id/textViewPoints" 
     android:text="Enter Points: " 
     android:textSize = "30sp" 
     android:textColor="#000000" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/textViewBottomMargin" 
     android:layout_alignParentLeft="true" 
     android:paddingBottom="10px" 
    ></TextView> 

    <EditText android:id="@+id/editTextPoints" 
     android:text="" 
     android:digits="-." 
     android:windowSoftInputMode="stateVisible" 
     android:focusable="true" 
     android:textSize = "30sp" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/textViewPoints" 
     android:layout_alignBottom="@+id/textViewPoints" 
     android:layout_above="@+id/textViewBottomMargin" 
     android:layout_toRightOf="@+id/textViewPoints" 
     android:paddingBottom="10px" 
    ></EditText> 

    <TextView android:id="@+id/textViewBottomMargin" 
     android:text="        " 
     android:textColor="#FFFFFF" 
     android:textSize = "5sp" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentBottom="true" 
     android:paddingBottom="0px" 
    ></TextView> 
    </RelativeLayout> 
</RelativeLayout> 

<include>文を使用してスクリーンショット:なし

enter image description here

スクリーンショット10の文と文のandroid:layout_above="@id/numberPadLayoutContainer"なし:

enter image description here

+0

これはいいですが、私が探している解決策であるかどうかはわかりません。上のコントロールを含む相対レイアウトが追加され、分離が可能になりました。トップの平均/ハイ/ロー/マックス、ミドルのスコア/スコアの校正、ボトムのポイント入力。それは、大きな携帯電話やタブレットで使用すると、アプリのサイズを自然に変えることができます。あなたが提案するソリューションは、大きな電話機やタブに大きな空白を残して、上部にコントロールをクラスタ化します。 – codingCat

+0

それでは、もう一度、画面上に唯一のレイアウトであるかのようにコントロールを配置できるようにしながら、上部にはRelativeLayoutを、下部にはキーボード(RelativeLayout)を追加する方法もあります。 – codingCat

+0

私はあなたの修正された質問の解決策を提供するために答えを編集しました。 – cdhabecker

0

キーボードレイアウトを下部に置くと、画面外に表示されることがあります。レイアウト全体をScrollViewに配置することで、そうであるかどうかを簡単に確認できます。

また、dp not pt値を使用してキーボードのlayout_heightを指定することをお勧めします。それ以外の場合は、さまざまな画面密度で正しく表示されないことがあります。

+0

私は同意するが、私はキーボードは画面をオフにレンダリングされていることをかなり確信しています。問題は、どうやってそれをやめさせるのかということです。どのようにすればいいのですか?キーボードを使って物理的な画面を共有するために、統計情報を取得するにはどうすればいいですか? – codingCat

+0

ああ、キーボードのPt値は、アプリケーションの実行時に動的にサイズ変更されるので、無関係です。この動的なサイズ変更は、レイアウトの残りの部分がうまく動作し、宣伝されたとおりに動作することが重要な理由です。 – codingCat

関連する問題