У меня Linearlayout с 1 или 2 linearlayouts зависит от конкретного имени.
Когда у меня короткое имя, которое входит в 1 строку, я использую 1 линейный макет и текстовые представления в нем программно, и у меня нет проблем с этим макетом - линейный макет соответствует его родительскому элементу и получает все пространство.
Но когда у меня длинное имя, которое вводится только в 2 строки, я использую 2 linearlayout, чтобы у каждого из них был рост 0,5, и к каждому из них я программно добавлял текстовые представления, и когда представление создается, я не могу видеть текстовые представления в первое линейное расположение, по какой-то причине они не отображаются на экране.
но когда я начинаю решать имя и добавляю текст в каждое текстовое представление, оно всплывает.
Я искал везде, но я не могу найти ответ на эту проблему.
Я добавил gif, чтобы вы увидели проблему, и я добавляю свой код.
GIF вида
Функция, которая создает макеты (класс расширяется от Linearlayout).
private void buildSolutionLettersLayout(){
try {
int maximumCharsInRow, letterTvSize;
if (mLogoName.length() >= 14) {
maximumCharsInRow = 13;
letterTvSize = mScreenWidth / 15;
} else {
maximumCharsInRow = 11;
letterTvSize = mScreenWidth / 13;
}
LinearLayout firstRow = new LinearLayout(getContext());
LinearLayout secondRow = new LinearLayout(getContext());
firstRow.setOrientation(LinearLayout.HORIZONTAL);
secondRow.setOrientation(LinearLayout.HORIZONTAL);
if (mLogo.getmLanguage() == Constants.LANGUAGE_ENGLISH) {
setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
} else {
setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}
boolean isFirstRow = true;
boolean isSeparator;
boolean isAfterSpace = false;
int firstRowLength = 0;
for (int i = 0; i < mLogoName.length(); i++) {
LinearLayout.LayoutParams layoutParamsLetterTv = new LinearLayout.LayoutParams(letterTvSize, letterTvSize);
layoutParamsLetterTv.setMargins(LETTERS_MARGIN, 0, LETTERS_MARGIN, 0);
AutoResizeTextView solutionLetterTv = new AutoResizeTextView(getContext());
solutionLetterTv.setLayoutParams(layoutParamsLetterTv);
solutionLetterTv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, MAX_TEXT_SIZE);
solutionLetterTv.setEms(1);
solutionLetterTv.setGravity(Gravity.CENTER);
solutionLetterTv.setTextColor(LETTER_TEXT_COLOR);
solutionLetterTv.setTag(false);
solutionLetterTv.setVisibility(View.VISIBLE);
isSeparator = false;
if (mLogo.getmLastTry().charAt(i) == Constants.SOLVED_SOLUTION_LETTER_BY_HELP) {
solutionLetterTv.setTextColor(REMOVED_SOLUTION_LETTER_TEXT_COLOR);
solutionLetterTv.setText(String.valueOf(mLogoName.charAt(i)));
solutionLetterTv.setBackgroundResource(R.drawable.background_letter_solution);
} else if (mLogo.getmLastTry().charAt(i) == Constants.SOLUTION_LETTER_WITHOUT_VALUE) {
solutionLetterTv.setText("");
solutionLetterTv.setBackgroundResource(R.drawable.background_letter_solution);
} else if (isSeparator(mLogo.getmLastTry().charAt(i))) {
solutionLetterTv.setTag(true);
solutionLetterTv.setText(String.valueOf(mLogo.getmLastTry().charAt(i)));
solutionLetterTv.setTextColor(SEPARATOR_TEXT_COLOR);
if (mLogo.getmLastTry().charAt(i) != APOSTROPHE) {
isSeparator = true;
if (mLogo.getmLastTry().charAt(i) == SPACE)
solutionLetterTv.setVisibility(View.INVISIBLE);
}
} else {
solutionLetterTv.setText(String.valueOf(mLogo.getmLastTry().charAt(i)));
solutionLetterTv.setBackgroundResource(R.drawable.background_letter_solution);
}
if (mLogo.getmStatus() == STATUS_SOLVED && !mLogo.ismIsForFastGame()) {
solutionLetterTv.setTextColor(LETTER_TEXT_COLOR);
solutionLetterTv.setText(String.valueOf(mLogoName.charAt(i)));
}
if (isFirstRow && isAfterSpace) {
int l = i;
String tempLogoName = mLogoName;
while (l < tempLogoName.length() && (!isSeparator(tempLogoName.charAt(l)) || tempLogoName.charAt(i) == APOSTROPHE))
l++;
int nextWordLength = l - i + 1;
if (nextWordLength + firstRowLength > maximumCharsInRow) {
isFirstRow = false;
if (mArrayOfLettersTvs.get(i - 1).getText().charAt(0) == SPACE)
mArrayOfLettersTvs.get(i - 1).setVisibility(GONE);
rowSpacePos = i-1;
}
isAfterSpace = false;
}
if (isSeparator)
isAfterSpace = true;
if (isFirstRow) { //while first row
firstRowLength++;
firstRow.addView(solutionLetterTv);
} else { //while second row
secondRow.addView(solutionLetterTv);
}
mArrayOfLettersTvs.add(solutionLetterTv);
}
if (secondRow.getChildCount() == 0) { //There is only 1 row
firstRow.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
firstRow.setGravity(Gravity.CENTER);
addView(firstRow);
if (mLogoName.length() > 11) {
for (TextView textView : mArrayOfLettersTvs) {
letterTvSize = mScreenWidth / (mLogoName.length() + 2);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(letterTvSize, letterTvSize);
lp.setMargins(LETTERS_MARGIN, 0, LETTERS_MARGIN, 0);
textView.setLayoutParams(lp);
}
}
} else { // There are 2 rows
LinearLayout.LayoutParams rowsParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0.5f);
firstRow.setLayoutParams(rowsParams);
secondRow.setLayoutParams(rowsParams);
firstRow.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
secondRow.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);
View rowsSpace = new View(getContext());
LayoutParams rowsSpaceParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ROWS_MARGIN);
rowsSpace.setLayoutParams(rowsSpaceParams);
addView(firstRow);
addView(rowsSpace);
addView(secondRow);
}
} catch (Exception e){
Logger.e(Logger.TEST, e.getMessage(), e);
ExceptionManager.getInstance().handleError(ExceptionManager.errorTypes.NAVIGATION, this, ((FragmentActivity)getContext()));
}
}
Дайте мне знать, если вам нужно больше частей моего кода ...