forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Android (http://forum.boolean.name/forumdisplay.php?f=150)
-   -   Динамическое создание кнопок в LinearLayout (http://forum.boolean.name/showthread.php?t=20349)

MotoMustanger 05.07.2016 23:19

Динамическое создание кнопок в LinearLayout
 
Пишу игрушку на Android, которая считывает количество уровней из файла и динамически создает соответсвенное им количество кнопок. Вот файл активити:
Код:

package com.CT;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class LevelsActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                LinearLayout dynamicview = (LinearLayout)findViewById(R.layout.levels);
                LinearLayout.LayoutParams lprams = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.FILL_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
                setContentView(dynamicview);

            for(int i=0;i<10;i++) {
                        Button btn = new Button(this);
                        btn.setId(i+1);
                        btn.setText("Button"+(i+1));
                        btn.setLayoutParams(lprams);
                        final int index = i;
                        btn.setOnClickListener(new OnClickListener() {
                            public void onClick(View v) {
                                Log.i("TAG", "The index is" + index);
                            }
                        });
                        dynamicview.addView(btn);
                    }

        }
       
}

Начальный файл разметки levels.xml, на который ссылается dynamicview следующий:
Код:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android'
    xmlns:tools='http://schemas.android.com/tools'
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
</LinearLayout>

Программа хорошо компилируется, но при запуске вылетает и выдает в LogCat ошибку:
Код:

07-05 19:05:58.313: W/dalvikvm(1098): threadid=1: thread exiting with uncaught exception (group=0x40015560)
07-05 19:05:58.342: E/AndroidRuntime(1098): FATAL EXCEPTION: main
07-05 19:05:58.342: E/AndroidRuntime(1098): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.CT/com.CT.LevelsActivity}: java.lang.NullPointerException
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.os.Looper.loop(Looper.java:123)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.app.ActivityThread.main(ActivityThread.java:3683)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at java.lang.reflect.Method.invokeNative(Native Method)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at java.lang.reflect.Method.invoke(Method.java:507)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at dalvik.system.NativeStart.main(Native Method)
07-05 19:05:58.342: E/AndroidRuntime(1098): Caused by: java.lang.NullPointerException
07-05 19:05:58.342: E/AndroidRuntime(1098):        at com.CT.LevelsActivity.onCreate(LevelsActivity.java:56)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-05 19:05:58.342: E/AndroidRuntime(1098):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
07-05 19:05:58.342: E/AndroidRuntime(1098):        ... 11 more

Что я делаю неправильно? Уже смотрел кучу форумов, но ответа так и не нашел.

FireOwl 06.07.2016 01:56

Ответ: Динамическое создание кнопок в LinearLayout
 
Код:

LinearLayout dynamicview = (LinearLayout)findViewById(R.layout.levels);
Тебе надо дать своему LinearLayout нормальный ID, и для того, чтобы добавить в него элементы, обращаться к нему через R.id.*, судя по всему.
А вообще надо конечно просто продебажить и найти место вылета, методом исключения.

MotoMustanger 06.07.2016 17:56

Ответ: Динамическое создание кнопок в LinearLayout
 
Вложений: 1
Добавил id в xml файл:
PHP код:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android'
    xmlns:tools='http://schemas.android.com/tools'
    android:orientation="horizontal"
    android:id="@+id/LevelsLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
</LinearLayout>

Debugger выдает NullPointerException (на скриншоте), не знаю, куда дальше копать.

LevelsActivity запускается только с таким закомментированным кодом:
PHP код:

package com.CT;

import com.CT.R;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

public class 
LevelsActivity extends Activity {
    
/** Called when the activity is first created. */
    
@Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
        
LinearLayout dynamicview = (LinearLayout)findViewById(R.id.LevelsLayout);
         
LinearLayout.LayoutParams lprams = new LinearLayout.LayoutParams(
                 
LinearLayout.LayoutParams.FILL_PARENT,
                 
LinearLayout.LayoutParams.WRAP_CONTENT);
         
/*setContentView(dynamicview);

         for(int i=0;i<10;i++) {
                Button btn = new Button(this);
                btn.setId(i+1);
                btn.setText("Button"+(i+1));
                btn.setLayoutParams(lprams);
                final int index = i;
                btn.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        Log.i("TAG", "The index is" + index);
                    }
                });
                dynamicview.addView(btn);
            }*/

    
}
    


но в этом случае показывается пустой черный экран, на котором ничего нет, что и понятно с кода.

FireOwl 06.07.2016 18:52

Ответ: Динамическое создание кнопок в LinearLayout
 
Это уже совсем фигня какая-то.

Смотри, самый простой способ сделать то, что ты хочешь.
Команде setContentView дать в качестве аргумента айдишник ресурса-лейаута.
Код:

setContentView(R.layout.levels);
(Лейаут лежит в levels.xml)

Далее находишь инстанс LinearLayout'a (на этот раз по его собственному ID):
Код:

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.LevelsLayout);
И уже в него начинаешь добавлять кнопки.

Жека 07.07.2016 07:13

Ответ: Динамическое создание кнопок в LinearLayout
 
Полагаю, ошибка в строке
PHP код:

setContentView(dynamicview); 

^ ты ставишь в качестве контента свой лэйаут, а нужно ставить всю xml-льку лэйаута.
Вот так:
PHP код:

setContentView(R.layout.levels); 


pozitiffcat 31.08.2016 16:26

Ответ: Динамическое создание кнопок в LinearLayout
 
Цитата:

Сообщение от Жека (Сообщение 306954)
Полагаю, ошибка в строке
PHP код:

setContentView(dynamicview); 

^ ты ставишь в качестве контента свой лэйаут, а нужно ставить всю xml-льку лэйаута.
Вот так:
PHP код:

setContentView(R.layout.levels); 


Кастомный вью тоже можно установить в content

Вот минимальный код который работает:
PHP код:

LinearLayout linearLayout = new LinearLayout(this);
        
linearLayout.setOrientation(LinearLayout.VERTICAL);

        for (
int i 010; ++i) {
            
Button button = new Button(this);
            
button.setText(String.format("Button %d"i));
            
linearLayout.addView(buttonViewGroup.LayoutParams.MATCH_PARENTViewGroup.LayoutParams.WRAP_CONTENT);
        }

        
setContentView(linearLayout); 



Часовой пояс GMT +4, время: 21:14.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot