Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > Android

Android Разработка игр на платформе Android

Ответ
 
Опции темы
Старый 05.07.2016, 23:19   #1
MotoMustanger
Нуждающийся
 
Регистрация: 13.11.2006
Сообщений: 60
Написано одно полезное сообщение
Динамическое создание кнопок в 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
Что я делаю неправильно? Уже смотрел кучу форумов, но ответа так и не нашел.
(Offline)
 
Ответить с цитированием
Старый 06.07.2016, 01:56   #2
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений
(для 1,836 пользователей)
Ответ: Динамическое создание кнопок в LinearLayout

LinearLayout dynamicview = (LinearLayout)findViewById(R.layout.levels);
Тебе надо дать своему LinearLayout нормальный ID, и для того, чтобы добавить в него элементы, обращаться к нему через R.id.*, судя по всему.
А вообще надо конечно просто продебажить и найти место вылета, методом исключения.
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.
(Offline)
 
Ответить с цитированием
Старый 06.07.2016, 17:56   #3
MotoMustanger
Нуждающийся
 
Регистрация: 13.11.2006
Сообщений: 60
Написано одно полезное сообщение
Ответ: Динамическое создание кнопок в LinearLayout

Добавил id в xml файл:
<?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 запускается только с таким закомментированным кодом:
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);
            }*/

    
}
    

но в этом случае показывается пустой черный экран, на котором ничего нет, что и понятно с кода.
Миниатюры
Нажмите на изображение для увеличения
Название: screen.png
Просмотров: 1025
Размер:	102.9 Кб
ID:	22411  
(Offline)
 
Ответить с цитированием
Старый 06.07.2016, 18:52   #4
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений
(для 1,836 пользователей)
Ответ: Динамическое создание кнопок в LinearLayout

Это уже совсем фигня какая-то.

Смотри, самый простой способ сделать то, что ты хочешь.
Команде setContentView дать в качестве аргумента айдишник ресурса-лейаута.
setContentView(R.layout.levels);
(Лейаут лежит в levels.xml)

Далее находишь инстанс LinearLayout'a (на этот раз по его собственному ID):
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.LevelsLayout);
И уже в него начинаешь добавлять кнопки.
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.
(Offline)
 
Ответить с цитированием
Старый 07.07.2016, 07:13   #5
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Динамическое создание кнопок в LinearLayout

Полагаю, ошибка в строке
setContentView(dynamicview); 
^ ты ставишь в качестве контента свой лэйаут, а нужно ставить всю xml-льку лэйаута.
Вот так:
setContentView(R.layout.levels); 
(Offline)
 
Ответить с цитированием
Старый 31.08.2016, 16:26   #6
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Динамическое создание кнопок в LinearLayout

Сообщение от Жека Посмотреть сообщение
Полагаю, ошибка в строке
setContentView(dynamicview); 
^ ты ставишь в качестве контента свой лэйаут, а нужно ставить всю xml-льку лэйаута.
Вот так:
setContentView(R.layout.levels); 
Кастомный вью тоже можно установить в content

Вот минимальный код который работает:
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); 
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Жека (02.09.2016)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com