Search code examples
androidcalendarview

How to set fixed size to TextView programmatically?


Dears I am trying to create my SimpleCalendarView By adding 7 TextViews horizontally in linear layout then repeat it 7 times .. But I am facing this issue with the TV's size which changes depending on the it's content .. could you help me to set suitable size for each TV programmatically Or is there best logic to follow ? Thank you

my code

public class MainActivity extends AppCompatActivity {

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

    LinearLayout linearLayout = findViewById(R.id.calendar_layout);
    int widthPx = getScreenWidthPx();
    int paddingVal = widthPx/21;
    int paddingVal2 = (int) (widthPx/16.5);
    int paddingVal3 = widthPx/17;

    String weekDays= "M,T,W,T,F,S,S";
    ArrayList<String> weekDaysList = new ArrayList<>(Arrays.asList(weekDays.split(",")));
    int dayNumber = 1, newMonthDayNumber = 1; ;
    // set days row in calendar view
    View calendarDaysRow = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE))
            .inflate(R.layout.calendar_row, null, false);
    LinearLayout linearLayoutDaysRow = calendarDaysRow.findViewById(R.id.calendar_row);
    for (int i = 1; i <7 ; i++) {
        View dayItem = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(R.layout.day_layout, null, false);
        TextView dayTV = dayItem.findViewById(R.id.day_tv);
        dayTV.setText(weekDaysList.get(i));
        dayTV.setPadding(paddingVal3,paddingVal,paddingVal3,paddingVal);
        linearLayoutDaysRow.addView(dayTV);
    }
    linearLayout.addView(linearLayoutDaysRow);

    // set month days in calendar view
    for (int j = 0; j < 6; j++) {
        View calendarRow = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(R.layout.calendar_row, null, false);
        LinearLayout linearLayoutRow = calendarRow.findViewById(R.id.calendar_row);
        for (int i = 1; i <7 ; i++) {
            View dayItem = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                    .inflate(R.layout.day_layout, null, false);
            final TextView dayTV = dayItem.findViewById(R.id.day_tv);
            if (dayNumber < 10) {
                dayTV.setText(String.valueOf(dayNumber++));
                dayTV.setPadding(paddingVal2,paddingVal,paddingVal2,paddingVal);
            }else if (dayNumber > 31){
                dayTV.setText(String.valueOf(newMonthDayNumber++));
                dayTV.setPadding(paddingVal2,paddingVal,paddingVal2,paddingVal);
                dayTV.setTextColor(ContextCompat.getColor(this, R.color.colorPrimary));
            }else {
                dayTV.setText(String.valueOf(dayNumber++));
                dayTV.setPadding(paddingVal,paddingVal,paddingVal,paddingVal);
            }
            dayTV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String text = dayTV.getText().toString();
                    Toast.makeText(getBaseContext(),text,Toast.LENGTH_SHORT).show();
                }
            });
            linearLayoutRow.addView(dayTV);
        }
        linearLayout.addView(linearLayoutRow);
    }
}

private int getScreenWidthPx (){
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    return metrics.widthPixels;
}
}

day.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@color/colorAccent"
android:text="20"
android:maxLines="1"
android:id="@+id/day_tv"
android:background="@drawable/day_back_ground"/>

row.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/calendar_row"/>

enter image description here


Solution

  • You can use textview attribute "ems" like android:ems

    sets the width of a TextView to fit a text of n 'M' letters regardless of the actual text extension and text size.