#java #android
#java #Android
Вопрос:
Я программировал приложение для Android, которое должно добавлять TextView
s программно. Предполагается добавить 28 из них с помощью цикла for. Ниже приведены важные части цикла:
for(int i = 0; i < 28; i ){
Log.i("Creating round", "" (i 1));
final int j = i;
roundLayout[i] = new LinearLayout(getActivity());
roundLayout[i].setOrientation(LinearLayout.HORIZONTAL);
roundLayout[i].setBackgroundColor(Color.WHITE);
roundLayout[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectRound(j);
}
});
layout.addView(roundLayout[i], lp);
TextView title = new TextView(getActivity());
title.setText("Round " MainActivity.intFormat(i 1, 2));
title.setGravity(Gravity.CENTER);
title.setTextSize(20);
title.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
roundLayout[i].addView(title, titleParams);
Итак, как вы можете видеть, этот цикл в каждой из своих итераций добавляет a roundLayout
в main layout
, и в каждой из них добавляет a Textview title
, отображающий круглое число. Однако, хотя предполагается создать 28 из них, создается только 27, но протоколирование продолжается до 28.
И вот что появляется в logcat:
I/Creating round: 1
I/Creating round: 2
I/Creating round: 3
I/Creating round: 4
I/Creating round: 5
I/Creating round: 6
I/Creating round: 7
I/Creating round: 8
I/Creating round: 9
I/Creating round: 10
I/Creating round: 11
I/Creating round: 12
I/Creating round: 13
I/Creating round: 14
I/Creating round: 15
I/Creating round: 16
I/Creating round: 17
I/Creating round: 18
I/Creating round: 19
I/Creating round: 20
I/Creating round: 21
I/Creating round: 22
I/Creating round: 23
I/Creating round: 24
I/Creating round: 25
I/Creating round: 26
I/Creating round: 27
I/Creating round: 28
Редактировать:
Я заметил, что контейнер (ширина и высота которого установлены в match_parent), в котором увеличен макет, может выходить за пределы экрана (если это вообще возможно). Взгляните на скриншоты ниже:
На первом скриншоте показан самый верхний элемент дерева компонентов. Мы можем четко видеть 4 синие линии, ограничивающие его. Однако на втором скриншоте показан контейнер, в котором макет раздут, и мы не видим ни правой, ни нижней строки, разделяющей его. Вот код для макета:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@ id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@ id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/appbar_padding_top"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@ id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_weight="1"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/app_name">
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager
android:id="@ id/container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Заранее спасибо!
Комментарии:
1. ваш TextView начинается с раунда 0?
2. Нет. Изменяется с 1 по 27.
3. просто добавьте «=» for(int i = 0; i <= 28; i ), и все готово
4. Неясно. Ваш
for
оператор выполняется 28 раз (от 0 до 27). Итак, в чем именно заключается ваш вопрос?5. Что вы имеете в виду, задавая свой вопрос? Ваш цикл продолжается от
i = 0
доi < 28
, более конкретно0, 1, ..., 26, 27
. вывод на консоль всегдаi 1
, so1, 2, ..., 27, 28
.
Ответ №1:
Проблема, похоже, связана с представлением, а не с циклом. Здесь я воспроизвожу представления с вашим кодом и слегка модифицирую его.
activity_main.xml
макет:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@ id/parent_rly"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content"/>
</ScrollView>
MainActivity.java код:
public class MainActivity extends AppCompatActivity {
private LinearLayout[] roundLayout;
private LinearLayout layout;
private LinearLayout.LayoutParams lp;
private LinearLayout.LayoutParams titleParams;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = findViewById(R.id.parent_rly);
roundLayout = new LinearLayout[28];
lp= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
titleParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
addingTextViews();
}
private void addingTextViews() {
for (int i = 0; i < 28; i ) {
Log.i("Creating round", "" (i 1));
roundLayout[i] = new LinearLayout(this);
roundLayout[i].setOrientation(LinearLayout.HORIZONTAL);
roundLayout[i].setBackgroundColor(Color.WHITE);
layout.addView(roundLayout[i], lp);
TextView title = new TextView(this);
title.setText("Round " (i 1));
title.setGravity(Gravity.CENTER);
title.setTextSize(20);
title.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
roundLayout[i].addView(title, titleParams);
}
}
}
и он правильно отображает представления:
Комментарии:
1. Макет создается не в MainActivity, а во фрагменте, увеличенном в контейнере activity_main (код в вопросе). Это контейнер, который, кажется, продолжается за пределами экрана.