Android динамически добавляет Scrollview-Content - PullRequest
0 голосов
/ 27 октября 2019

Я изо всех сил добавляю некоторый контент для просмотра прокрутки динамически. Я бы предпочел, если бы кто-то мог дать мне объяснение, почему мое приложение вылетает.

public class LessonView extends AppCompatActivity {
    int maxWidth = 450;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // old
        ScrollView SView = new ScrollView(this);

        // new
        // LinearLayout activityLL = (LinearLayout) findViewById(R.id.myLL);

        RelativeLayout.LayoutParams centerTableParameters = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT
        );
        centerTableParameters.addRule(RelativeLayout.CENTER_IN_PARENT);

        LinearLayout llayout = new LinearLayout(this);
        llayout.setOrientation(LinearLayout.VERTICAL);
        llayout.setGravity(Gravity.CENTER);

        Resources res  = getResources();

        Intent in = getIntent();
        int index = in.getIntExtra("com.example.ITEM_INDEX", -1);

        if(true){


            // create tables:
            boolean tablesEnd = false;
            boolean lineEnd = false;
            int j = 0;
            int i = 0;
            while(i < cn.length){
                TableLayout tableLayout = new TableLayout(this);
                TableRow tableRow1 = new TableRow(this);
                TableRow tableRow2 = new TableRow(this);
                TableRow tableRow3 = new TableRow(this);
                TableLayout.LayoutParams lp = new TableLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

                tableLayout.setLayoutParams(lp);

                // create lines:
                lineEnd = false;
                while(i < cn.length && lineEnd == false){
                     [...]
                }

                tableLayout.addView(tableRow1);
                tableLayout.addView(tableRow2);
                tableLayout.addView(tableRow3);

                llayout.addView(tableLayout, centerTableParameters);
                Space space = new Space(this);
                space.setLayoutParams(new LinearLayout.LayoutParams(10, 20));
                llayout.addView(space);

            }

            // old:
            SView.addView(llayout);
            setContentView(SView);

            // new:
            //activityLL.addView(llayout);
            //setContentView(R.layout.activity_lesson_view);
        }
    }

, если я запускаю его со «старым» кодом (см. Строки под комментарием «старый»), оно работает нормально безошибки. Старый код не использует файл макета. Я хотел бы добавить еще несколько функций в макет;) Как только я начинаю занятие с "новыми" строками (старые строки как комментарии), приложение вылетает с сообщением об ошибке:

2019-10-26 23: 51: 42.694 4599-4599 / com.example.MyApp E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.MyApp, PID: 4599 java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {com. example.MyApp / com.example.MyApp.LessonView}: java.lang.NullPointerException: попытка вызвать виртуальный метод «void android.widget.LinearLayout.addView (android.view.View)» для ссылки на пустой объект в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2913) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3048) в android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78) в android.app.servertaction. TransactionExecutor.executeCallbacks (TransactionExecutor.java:108) в android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1808) в android.os.Handler.dispatchMessage (Handler.java:106) в android.os.Looper.loop (Looper.java: 193) в android.app.ActivityThread.main (ActivityThread.java:6669) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java): 493) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858) Причина: java.lang.NullPointerException: Попытка вызвать виртуальный метод void android.widget.LinearLayout.addView (android.view. View) 'для ссылки на пустой объект в com.example.MyApp.LessonView.onCreate (LessonView.java:242) в android.app.Activity.performCreate (Activity.java:7136) в android.app.Activity.performCreate (Activity.java: 7127) в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1271) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2893) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3048) в android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78) в android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108) в android.app.servertactionecransT. .execute (TransactionExecutor.java:68) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1808) в android.os.Handler.dispatchMessage (Handler.java:106) в android.os.Looper.loop (Looper.java:193) в android.app.ActivityThread.main (ActivityThread.java:6669) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)

Ошибка, по-видимому, возникает при "activityLL.addView(llayout);" (line 242), но у меня нет объяснения, почему. ..

1 Ответ

0 голосов
/ 27 октября 2019

Вы должны позвонить setContentView(R.layout.activity_lesson_view); перед извлечением LinearLayout с LinearLayout activityLL = (LinearLayout) findViewById(R.id.myLL);

...