2015-12-08 2 views
2

Работая над небольшим проектом для моего друга, и у меня возникают проблемы выравнивание текста по вертикали при использовании TextViewAlign TextView Текст Вертикально Programatically (Нет XML)

Вот мой класс активности (Pure Java нет XML):

import android.content.Context; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.Gravity; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView; 
import android.widget.ArrayAdapter; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.TableLayout; 
import android.widget.TextView; 

public class WeightHistory extends AppCompatActivity { 

    WeightLog[] history = {new WeightLog(30030, 100, 50), new WeightLog(30030, 50, 55), new WeightLog(30030, 55, 40), new WeightLog(30030, 40, 40)}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ListView list = new ListView(this); 
     list.setAdapter(new MyAdapter(this, history)); 
     setContentView(list); 
    } 

    private class MyAdapter extends ArrayAdapter<WeightLog> { 

     public MyAdapter(Context context, WeightLog[] logs) { 
      super(context, -1, -1, logs); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      LinearLayout listLayout = new LinearLayout(WeightHistory.this); 
      listLayout.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT)); 

      WeightLog weightLog = super.getItem(position); 
      TextView listText = new TextView(WeightHistory.this); 
      listText.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT, 1f)); 

      listText.setGravity(Gravity.START | Gravity.CENTER); 

      listLayout.addView(listText); 
      /* if (weightLog.lostWeight() || weightLog.gainedWeight()) { 
       listText.setTextColor(Color.WHITE); 
       listText.setBackgroundColor(weightLog.lostWeight() ? Color.GREEN : Color.RED); 
      }*/ 
      listText.setText(weightLog.toString()); 

      return listLayout; 
     } 
    } 

} 

Вот класс WeightLog (класс, который получает отображается в списке), если вы любопытны

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

/** 
* Created by Jonathan on 12/8/2015. 
*/ 
public final class WeightLog { 

    private final long time; 
    private final double lastWeight, currentWeight; 


    public WeightLog(long time, double lastWeight, double currentWeight) { 
     this.time = time; 
     this.lastWeight = lastWeight; 
     this.currentWeight = currentWeight; 
    } 

    public boolean lostWeight() { 
     return currentWeight < lastWeight; 
    } 

    public boolean gainedWeight() { 
     return currentWeight > lastWeight; 
    } 

    @Override 
    public String toString() { 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(new Date(time)); 
     int day = cal.get(Calendar.DAY_OF_MONTH); 
     SimpleDateFormat month_date = new SimpleDateFormat("MMM"); 
     String month_name = month_date.format(cal.getTime()); 
     return "Week of " + month_name + " " + formatDay(day) + ":\t\t\t\t\t\t" + lastWeight + "\t\t\t\t\t\t" + currentWeight + "\t\t\t\t\t\t" + (lastWeight == currentWeight ? "=" : lastWeight < currentWeight ? "+" : "-"); 
    } 

    public String formatDay(int day) { 
     int j = day % 10, 
       k = day % 100; 
     if (j == 1 && k != 11) { 
      return day + "st"; 
     } 
     if (j == 2 && k != 12) { 
      return day + "nd"; 
     } 
     if (j == 3 && k != 13) { 
      return day + "rd"; 
     } 
     return day + "th"; 
    } 
} 

Вот вопрос, который я имею:

Image of issue

Как вы можете видеть, что числа не выровнены по вертикали.

Как я могу достичь этого без использования XML? Благодаря!

ответ

1

В WeightLog.toString() для этой линии:

return "Week of " + month_name + " " + formatDay(day) + 
    ":\t\t\t\t\t\t" + lastWeight + "\t\t\t\t\t\t" + currentWeight + "\t\t\t\t\t\t" + 
    (lastWeight == currentWeight ? "=" : lastWeight < currentWeight ? "+" : "-"); 

Попробуйте использовать string.Format(). Документация находится здесь: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format(java.lang.String,%20java.lang.Object...)

Использование string.Format(), эта линия стала бы следующее:

return String.format("Week of %s %4s: %10.1f %10.1f %10s", 
      month_name, formatDay(day), lastWeight, currentWeight, 
      (lastWeight == currentWeight ? "=" : 
       lastWeight < currentWeight ? "+" : "-") 
      ); 

Я на самом деле не пробовал это в Android проекта, но в консольной программе Java, это код делает все номера идеально. Если это не работает так, как вы хотите на Android, вам нужно либо переключиться на моноширинный шрифт, либо использовать XML. Я мог ошибаться, но я думаю, что XML - это решение, которое Google захочет использовать.

Возможно, вам потребуется сыграть со строкой формата, чтобы дисплей отображался так, как вы хотите; документация находится по адресу: http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax

+0

Да, я ранее использовал это на Java для выравнивания вывода в консоли, но к сожалению, он не работал в Android. –

+0

2 вопроса: 1) В чем была проблема, когда вы пробовали его в Android? 2) Есть ли причина, по которой вы не используете XML для форматирования? –

+0

Хорошо, я вижу проблему сейчас. Я попробовал String.format(), используя шрифт по умолчанию, и ничего не выстроилось правильно, потому что размер пробелов не такой же, как и числовые символы. Попробуйте listText.setTypeface (Typeface.MONOSPACE); который установит моноширинный шрифт. Он выглядит уродливым, но номера выстраиваются правильно. –

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