2013-08-03 3 views
0

Я хочу создать простой калькулятор в качестве моего первого проекта андроида (вместо Helloworld), здесь показан интерфейс пользователя calculaotr, который я использую GridLayout, чтобы упорядочить отображение результатов TextView и контроль Button s, GridLayout занимает 6 строк и 4 столбца. (Я упростил файл макета XML здесь)Как сделать свой пользовательский интерфейс UI для Android Android

<GridLayout android:rowCount="6" 
      android:columnCount="4" 
      android:orientation="horizontal"> 
    <TextView android:id="@+id/expressionTextView" 
       android:layout_columnSpan="4"/> 
    <LinearLayout 
       android:layout_columnSpan="4"> 
     <Button android:id="@+id/btnClearText"/> 
     <Button android:id="@+id/btnDeleteText"/> 
    </LinearLayout> 
<GridLayout> 

enter image description here

Для создания кнопки +/-/x//0-9., я использую следующий код:

String[] buttonTexts = new String[] 
{ 
    "7", "8", "9", "/", 
    "4", "5", "6", "x", 
    "1", "2", "3", "-", 
    ".", "0", "=", "+" 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Point size = new Point(); 
    getWindowManager().getDefaultDisplay().getSize(size); 
    int screenWidth = size.x; 
    int screenHeight = size.y; 
    int oneQuarterWidth = (int) (screenWidth * 0.25); 

    for (int ii = 0; ii < buttonTexts.length; ii++) { 
     Button btn = new Button(this); 
     btn.setText(buttonTexts[ii]); 
     btn.setTextSize(40); 

     GridLayout.Spec rowSpec = GridLayout.spec(ii/4 + 2); 
     GridLayout.Spec columnSpec = GridLayout.spec(ii % 4); 
     GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpec, columnSpec); 
     params.setGravity(Gravity.FILL); 
     params.width = oneQuarterWidth; 
     gridLayout.addView(btn, params); 
    } 

Однако последний ряд растягивает по вертикали , и при запуске калькулятора на моей машине андроида, некоторые из последних строк могут быть скрыты!

Я хочу, чтобы пользовательский интерфейс соответствовал высоте устройства, есть ли у вас какие-либо идеи? Благодаря!

P.S. Я даже попытался установить высоту отображения результата TextView и LinearLayout, который содержит Clear/Del с помощью:

expressionTextView = (TextView)findViewById(R.id.expressionTextView); 
clearDelLinearLayout = (LinearLayout)findViewById(R.id.linearLayout1); 

GridLayout.LayoutParams expressionTextViewParams = 
    (GridLayout.LayoutParams)expressionTextView.getLayoutParams(); 
expressionTextViewParams.height = ...; // some calculated height 
expressionTextView.setLayoutParams(expressionTextViewParams); 

Но это не работает :(

+0

Вы имеете в виду горизонтальное направление? –

+0

Спасибо за ваш комментарий, я использовал горизонтальное направление. –

ответ

0

из документации:

Ограничения :

GridLayout не поддерживает принцип вес, как определено i n вес. В общем случае, возможно, сконфигурировать GridLayout для распределения избыточного пространства между несколькими компонентами . Однако некоторые распространенные случаи использования могут быть учтены, как следует из . Поместить равные количества пространства вокруг компонента в ячейку ; используйте выравнивание CENTER (или гравитацию). Для полного контроля над распределением избыточного пространства в строке или столбце ; используйте подстраницу LinearLayout , чтобы удерживать компоненты в связанной группе сот. Когда , используя любую из этих методик, помните, что группы ячеек могут быть , определенные для перекрытия.

Source

попробуйте использовать LinearLayouts для детей, как:

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" android:orientation="horizontal"> 
<Space 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 
<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/btnClearText" /> 

Или вы можете просто использовать другую раскладку, как, например, LinearLayout, что довольно непротиворечиво, когда дело доходит до рендеринга

P.S.

из документации:

вызов setLayoutParams (ViewGroup.LayoutParams) должны быть сделаны уведомить GridLayout изменения

Может быть, после изменения параметров макета, вы должны вызвать GridLayout.invalidate();?

+0

Я просто задаюсь вопросом, есть ли способ установить ячейку GridLayout с расчетной высотой, которая сделает все идеально подходящим? –

+0

@ZhiWang попытается вызвать invalidate на вашем GridLayout после изменения параметров макета –

+0

Спасибо за упоминание ограничения, я также думаю, что использование вложенного linearlayout может решить эту проблему. –

Смежные вопросы