цикл for останавливается перед последней итерацией

#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 , so 1, 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 (код в вопросе). Это контейнер, который, кажется, продолжается за пределами экрана.