2012-01-14 5 views
1

偽のLCDディスプレイを作成しようとしています。テキストビューは、固定幅の文字の幅で中央に配置します

それはLCDの外観を偽造、いくつかのデータを示すいくつかの通常のテキスト、および背景の存在している必要があります: img01

を私は互いの上に3 TextViewsを合わせ、このXMLを書きました。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/footer_linearLayout_footer_parent" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/dashboard_bottom_background" 
    android:gravity="center" 
    android:padding="3dip" > 

    <TextView 
     android:id="@+id/textView_heading" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:ellipsize="none" 
     android:lines="1" 
     android:text="text" 
     android:textColor="@color/holo_blue_light" 
     android:textSize="28dip" /> 

    <TextView 
     android:id="@+id/textView_heading2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:alpha="0.15" 
     android:ellipsize="none" 
     android:gravity="center" 
     android:lines="1" 
     android:text="88888888888888888888888888888888888" 
     android:textColor="@color/holo_blue_light" 
     android:textSize="28dip" /> 

    <TextView 
     android:id="@+id/textView_heading3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:alpha="0.15" 
     android:gravity="center" 
     android:lines="1" 
     android:text="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
     android:textColor="@color/holo_blue_light" 
     android:textSize="28dip" /> 

</RelativeLayout> 

は、いくつかのケースのために正常に動作しますが、今一番上の表示が変わるのtextlengthがあれば何が起こるか見て:としてだけ上位表示が変更 img02

ビューが正しく、もはや整列されていないそのしたがって、再度中心合わせされます。

私が求めています何、はTextViewのをセンタリングする可能性があるが、唯一の使用monospace -font

答えて

1

の1つの文字の幅の段階で、私は最善の解決策を使用することだと思いますTextViewは、2つのレイヤー「8」および「X」をバックグラウンドとして表すドロアブルを持つ各文字用です。あなたが希望する場合

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/textView_heading" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/char_0" 
     android:layout_width="0px" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center" 
     android:text="0" 
     android:textColor="@color/holo_blue_light" 
     android:textSize="28dip" 
     android:background="@drawable/lcd_char"/> 

    <TextView 
     android:id="@+id/char_1" 
     android:layout_width="0px" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center" 
     android:text="1" 
     android:textColor="@color/holo_blue_light" 
     android:textSize="28dip" 
     android:background="@drawable/lcd_char"/> 

    <!-- ... --> 

    <TextView 
     android:id="@+id/char_n" 
     android:layout_width="0px" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center" 
     android:text="n" 
     android:textColor="@color/holo_blue_light" 
     android:textSize="28dip" 
     android:background="@drawable/lcd_char"/> 
</LinearLayout> 

しかし、あなたはまた、このようにそれぞれの層のための3つの水平LinearLayoutを使用することができます。

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:id="@+id/textView_heading" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/char_0" 
      android:layout_width="0px" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:text="0" 
      android:textColor="@color/holo_blue_light" 
      android:textSize="28dip" 
      android:background="@drawable/lcd_char"/> 

     <!-- ... --> 
    </LinearLayout> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/textView_heading2" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/char_8_0" 
      android:layout_width="0px" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:alpha="0.15" 
      android:text="8" 
      android:textColor="@color/holo_blue_light" 
      android:textSize="28dip" 
      android:background="@drawable/lcd_char"/> 

     <!-- ... --> 
    </LinearLayout> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/textView_heading3" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/char_X_0" 
      android:layout_width="0px" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:alpha="0.15" 
      android:text="X" 
      android:textColor="@color/holo_blue_light" 
      android:textSize="28dip" 
      android:background="@drawable/lcd_char"/> 

     <!-- ... --> 
    </LinearLayout> 
</merge> 

だからのonCreate()メソッドでは、あなたは、このように全てのLED文字を取得することができます。

TextView[] lcdChars = new TextView[3/*lcd size*/]; 
for (int i = 0; i < lcdChars.length; i++) { 
    int resID = getResources().getIdentifier("char_"+i, "id", getPackageName()); 
    lcdChars[i] = (TextView) findViewById(resID); 
} 

そして、このような方法で必要なテキストを設定します。

private void setLCDText(char[] chars){ 
    for (int i = 0; i < lcdChars.length; i++) { 
     if(i < chars.length){ 
      lcdChars[i].setText(chars, i, 1); 
     }else{ 
      lcdChars[i].setText(""); 
     } 
    } 
} 
+0

ありがとうございます。ただし、そのコードでは、テキストは左揃えになります。しかし、それを中心にすることは大したことではありません。この解決策の欠点は、数字の桁数がそれ以上変わることがなく、画面サイズを犠牲にすることができないことです。もし私がそれを使うことができれば、多分いくつかの修正を加えて、私はそれを調べるでしょう。 – msal

+0

@ walla:画面サイズに合わせて、実行時に 'TextView'sを' LinearLayout'に追加することができます。 もう1つの解決策は、Androidが望むように、異なる桁数の異なるXMLレイアウトを持つことです[複数のスクリーンをサポート](http://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts):たとえば7インチのタブレットで5桁、10インチのタブレットで8桁の 'res \ layout-sw720dp \ lcd_layout.xml'を持つ' res \ layout-sw600dp \ lcd_layout.xml'を持っています。 –

+0

良い点。私はそれを考慮に入れます。 – msal

関連する問題