forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Android (http://forum.boolean.name/forumdisplay.php?f=150)
-   -   Помогите новичку! (http://forum.boolean.name/showthread.php?t=16699)

ratum 25.04.2012 17:19

Помогите новичку!
 
Вложений: 3
Недавно перешёл с Nokia 5310 на Samsung GT I-9001. До этого работал над рогаликом, который успешно писался на MidletPascal. Хочу портировать всё под андроид, но опыта работы с java нет.
Начал делать проект по аналогии с книгой Pragmatic Hello Android. Застрял практически в начале: при вызове метода из другого класса (getTile из MapView) , который возвращает элемент массива, приложение крашится.
Понимаю, что ошибка мелкая, но сам ни черта ни понимаю:)

PS. Посоветуйте книги по ооп на Java (можно и на английском).

cyberblut 25.04.2012 17:42

Ответ: Помогите новичку!
 
Ну так алгоритм простой, не надо лениться:

1. Посмотреть текст ошибки
2. Подебажить
3. Спросить, указав всю инфу

ratum 25.04.2012 17:52

Ответ: Помогите новичку!
 
В том то и дело, что компилирует без ошибок.

cyberblut 25.04.2012 18:50

Ответ: Помогите новичку!
 
Цитата:

Сообщение от ratum (Сообщение 226446)
В том то и дело, что компилирует без ошибок.

Ну так если падает, значит пишет где и почему упало.

Жека 26.04.2012 11:20

Ответ: Помогите новичку!
 
Крашится скорее всего из-за того, что твой MapView ещё не создан на момент обращения к его методу. Активити нельзя создавать через NEW.

В какой среде разработки ты делаешь проект? Если в эклипсе, то выкладывай всю папку с проектом, а то эти тхт-шки вынуждают всё самому доделывать, а нафиг это нужно.

cyberblut 26.04.2012 12:36

Ответ: Помогите новичку!
 
Цитата:

Сообщение от Жека (Сообщение 226524)
Крашится скорее всего из-за того, что твой MapView ещё не создан на момент обращения к его методу. Активити нельзя создавать через NEW.

В какой среде разработки ты делаешь проект? Если в эклипсе, то выкладывай всю папку с проектом, а то эти тхт-шки вынуждают всё самому доделывать, а нафиг это нужно.

На сколько я обратил внимание - MapView не активити, а вьюха.

ratum 26.04.2012 18:23

Ответ: Помогите новичку!
 
Вложений: 1
В основном на телефоне через AIDE пишу.
Вроде переписал код на Eclipse. Проверить не могу: после очистки workspace эмулятор андроид ведёт себя неадекватно. Останавливается на шаге Waiting for HOME ('android.process.acore') to be launched...

Жека 27.04.2012 10:08

Ответ: Помогите новичку!
 
Тестировать конечно лучше на настоящем телефоне.
Ошибка у тебя не в коде оказалась, а в том что ты не указал все свои активити в манифесте.
В файле AndroidManifest.xml нужно указывать все активити, которые ты собираешься запускать.
Я дописал
Код:

<activity
    android:name=".Game"
    android:label="@string/app_name" >
</activity>

И всё заработало, увидел поле с зелёными циферками.
Про вьюху не заметил когда писал выше.

ratum 27.04.2012 15:19

Ответ: Помогите новичку!
 
Вложений: 1
Совсем забыл про манифест. Но проблема не в нём. В оригинале (на AIDE) манифест был дописан. И не работало.
При замене int на MapClass опять крашится. В чём причина?
И последний: как убрать полосу состояния при включённом приложении?

moka 27.04.2012 15:29

Ответ: Помогите новичку!
 
Активити создаётся автоматически при старте прилоежения самой ОСью. Тебе не нужно создавать активити самому. В конструкторе активити, тебе нужно указать View, он может быть лайоутом генерированным в эклипсе, или твоим классом. Но тогда он должен иметь в себе реализацию всех методов и т.п.

Также, если ты хочешь заняться графикой, советую сразу смотреть в сторону ОГЛ либо канвасы.

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

Жека 28.04.2012 06:16

Ответ: Помогите новичку!
 
Вложений: 1
Цитата:

Сообщение от ratum (Сообщение 226636)
Совсем забыл про манифест. Но проблема не в нём. В оригинале (на AIDE) манифест был дописан. И не работало.
При замене int на MapClass опять крашится. В чём причина?

Причина скорей всего в том что перед обращением к экземпляру MapClass ты не создал его.
Выкладываю тебе код исправленный, в нём всё работает с MapClass.
Цитата:

И последний: как убрать полосу состояния при включённом приложении?
Я знаю два способа, оба включил в твою прогу.
1. Прописать в AndroidManifest.xml строчку-параметр для активити
Код:

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
2. В коде для метода активити onCreate(Bundle b) написать две строки
Код:

super.onCreate(b);
//полноэкранный режим
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

Цитата:

ЗЫ, до того как заниматься портами, пройдись по туторам от гугла, разберись как андройд устроен, т.к. это очень отличается от всего другого
Прислушайся к совету, разберись в простом, потом переходи к своим задумкам.

ratum 28.04.2012 13:06

Ответ: Помогите новичку!
 
Спасибо всем огромное! Сам без помощи не разобрался бы. Буду выкладывать новые вопросы по мере появления:)

ratum 05.05.2012 15:53

Ответ: Помогите новичку!
 
Вложений: 1
Дописал код, добавил геттеры и сеттеры, но метод fillArea перестал работать. Или не правильно обращаюсь к массиву? Где я ошибся?

Как работать с изобржениями (загрузка, вывод) ? Как работать с таилсетами? На developer.android.com ничего не понимаю:)

ratum 09.05.2012 15:09

Ответ: Помогите новичку!
 
Проблемы решены! Есть ли стандартные методы для работы с таилсетами(создание маленького нового изображения из одного большого)?

ratum 14.05.2012 23:27

Ответ: Помогите новичку!
 
В активити Game создан экземпляр hero класса Hero. При нажатии кнопки в MapView(view для Game) создаётся активити Inventory. Как из Inventory получить доступ к hero?

cyberblut 15.05.2012 09:30

Ответ: Помогите новичку!
 
Цитата:

Сообщение от ratum (Сообщение 227997)
В активити Game создан экземпляр hero класса Hero. При нажатии кнопки в MapView(view для Game) создаётся активити Inventory. Как из Inventory получить доступ к hero?

никак

ratum 15.05.2012 17:54

Ответ: Помогите новичку!
 
То есть нельзя чтобы несколько классов имели доступ к одному и тому же экземпляру класса х?

cyberblut 15.05.2012 18:42

Ответ: Помогите новичку!
 
Цитата:

Сообщение от ratum (Сообщение 228018)
То есть нельзя чтобы несколько классов имели доступ к одному и тому же экземпляру класса х?

Нельзя, чтобы контексто-зависимые классы имели доступ друг к другу. Из активити A нельзя получить доступ к активити B напрямую. Равно как и к их вьюхам.

Жека 16.05.2012 07:23

Ответ: Помогите новичку!
 
Как вариант, можно создать отдельный класс для хранения глобальных указателей, и через него работать с объектами.
Типа:
Код:

public class Globals {
        public static Hero hero;
}

Далее в коде в любом классе пишем:
Код:

Globals.hero = new Hero("John");
Ещё в другом месте обращаемся к свойствам:
Код:

if(Globals.hero != null && Globals.hero.getHealth() > 10) {
  //.....
}

Вместо Globals можно написать покороче имя для удобства, например G.

ratum 16.05.2012 18:59

Ответ: Помогите новичку!
 
Точно! Спасибо большое! А то я запутался немного))

ratum 17.05.2012 18:50

Ответ: Помогите новичку!
 
Допустим, что в Game создан экземпляр Global:

global = new Global(this);

В Global созданы экземпляры 2 разных View. Как в Game задать setContentView() через эти 2 экземпляра?

moka 18.05.2012 00:35

Ответ: Помогите новичку!
 
Научись формировать вопрос, в понятный текст, чтобы он давал читателю представление ЧТО ты пытаешься сделать, и КАК ты это уже попробовал сделать.
Если чётко сформируешь вопрос, то в 90% случаях ответишь на свой же вопрос сразу. Если таки не смог, по крайней мере другие смогут понять вопрос и помочь.

ratum 18.05.2012 01:12

Ответ: Помогите новичку!
 
В Game создан экземпляр Global. В Global описываются все остальные классы: объекты и вьюхи для Game (как предложил Жека), так как хочу использовать одну активити и несколько вьюх. Но не получается установать вьюхи для отображения в Game. Если в Global объявляю Game как final то eclipse ругается на конструкторы вьюх (что Game не инициализируется, хотя раньше делал абсолютно так же), если Game без final, то eclipse компилирует без ошибок, но при старте активити Game приложение вылетает. Вот так)

Жека 18.05.2012 07:02

Ответ: Помогите новичку!
 
Я не предлагал создавать global через new. Я предлагал сделать все его члены статическими, чтобы осуществлять доступ не через экземплял глобал'а, а через имя класса. И не финальными они должны быть, т.к. финальные поля нужно либо в объявлении инициализировать, либо в конструкторе, но такой вариант не подходит, т.к. ты заранее не захочешь всё создавать в конструкторе и не сможешь (в случае с активити).
Делай так в классе Global:
Код:

public static Game game;
Далее, активити нельзя создавать через new, оно само создаётся; отследить создание можно в методе с именем onCreate(Bundle b), в этом методе делай присвоение переменной
Код:

Global.game = this;
И так для всех активити.
И всё, однажды присвоив значение, сможешь везде с ним работать.

ratum 18.05.2012 17:34

Ответ: Помогите новичку!
 
Вроде понял. Буду пробовать.

ratum 21.05.2012 23:53

Ответ: Помогите новичку!
 
Спасибо, Жека! Всё работает!:)

Как можно отследить/заблокировать нажатие кнопки "назад"/"меню"?

Жека 22.05.2012 06:38

Ответ: Помогите новичку!
 
Посмотри статейку: Создание меню

ratum 14.10.2012 21:09

Ответ: Помогите новичку!
 
Как можно сделать прокрутку? Нужно для прокрутки карты, которая не влезает на экран. Пробовал через MotionEvent.ACTION_MOVE, но получается какая-то ересь.

Жека 15.10.2012 10:41

Ответ: Помогите новичку!
 
Я для прокрутки использую ScrollView.
В методе onCreate:
PHP код:

ScrollView sv = new ScrollView(this);
sv.setFillViewport(true);
LinearLayout lay = new LinearLayout(this);
lay.setOrientation(LinearLayout.VERTICAL);
sv.addView(lay);
//здесь добавляем всё что нужно в лайаут lay
//например 10 кнопок:
int pad 30;
lay.setPadding(padpadpadpad);
Button b;
for(
int k=0;k<10;++k) {
    
= new Button(this);
    
b.setText("Кнопка "+k);
    
b.setId(1000+k);
    
//b.setOnClickListener(ButtonListener);
    
b.setEnabled(== 0);
    
lay.addView(b);
}
setContentView(sv); 


ratum 15.10.2012 18:11

Ответ: Помогите новичку!
 
А как сделать это без LinearLayout? То есть я использую

case MotionEvent.ACTION_DOWN:
x = (int)event.getX();
y = (int)event.getY();

для определения области касания, так как не использую кнопки. Можно ли реализовать "сырую" (с получением и ручной обработкой координат) прокрутку, без использования layout?

Жека 17.10.2012 06:49

Ответ: Помогите новичку!
 
Вручную вот так мне видится решение:
Тебе нужно расширить метод onTouchEvent, на событие ACTION_DOWN запоминать координаты нажатия, как ты и делаешь, и затем на событие ACTION_MOVE вычислять разность координат, далее вручную всё сдвигать на полученные dx, dy.
Код:

case MotionEvent.ACTION_DOWN:
  prevX = (int)event.getX();
  prevY = (int)event.getY();
  break;

case MotionEvent.ACTION_MOVE:
  int x = (int)event.getX();
  int y = (int)event.getY();
  int dx = x-prevX;
  int dy = y-prevY;
  prevX = x;
  prevY = y;
  if(dx != 0 || dy) { //надо бы сдвинуть
    scroll(dx, dy);
  }
  break;

Тут же можно настроить чувствительность скролла, например чтобы он срабатывал при прокрутке на не менее какого-то расстояния.
Код:

int min = 5;
int dx = x-prevX;
if(Math.abs(dx) < min)
  dx = 0; //считаем что вообще не сдвинулись по Х
else
  prevX = x; //обновляем только если прокрутили нужное расстояние
int dy = y-prevY;
if(Math.abs(dy) < min)
  dy = 0;
else
  prevY = y;


Morganolla 14.12.2012 11:47

Ответ: Помогите новичку!
 
Ща делаю на Юнити 2D игруху и компилю в .apk файл. Нужен легкий и простой эмулятор андроида для ПиСи под ВиндуХР, который может запускать .apk файлы. Посоветуйте и порекомендуйте плиз, чтобы зря не тестить всякий хлам...

RegIon 14.12.2012 14:55

Ответ: Помогите новичку!
 
В комплект сдк входит AVD (android virtual device)
http://www.androidteach.ru/2012/05/avd.html вместо первого шага тебе просто щелкнуть на AVD Manager в меню пуск
Но мне не лень тестить на чистом железе (какая разница, все равно процесс установки проходит через adb, скорость слегка отличается)

moka 14.12.2012 15:12

Ответ: Помогите новичку!
 
Лучше конечно на железе, т.к. эмулятор обычно очень тормозит, т.к. полностью эмулируют другую структуру процессора - а это геморой конкретный..

pozitiffcat 20.12.2012 12:47

Ответ: Помогите новичку!
 
Цитата:

Сообщение от Костян (Сообщение 246539)
В комплект сдк входит AVD (android virtual device)
http://www.androidteach.ru/2012/05/avd.html вместо первого шага тебе просто щелкнуть на AVD Manager в меню пуск
Но мне не лень тестить на чистом железе (какая разница, все равно процесс установки проходит через adb, скорость слегка отличается)

ты даже не представляешь как виртуалка тормозит раз в 100 медленней

RegIon 20.12.2012 13:38

Ответ: Помогите новичку!
 
Цитата:

Сообщение от pozitiffcat (Сообщение 247093)
ты даже не представляешь как виртуалка тормозит раз в 100 медленней

Я установку имел ввиду.

NetBuilding 04.02.2013 16:33

Ответ: Помогите новичку!
 
Ребята, я совсем немного знаю Java.
Прошу сильно по голове не бить. Но пробую написать чтонибудь под андройд.
Вот сее творение:
Код:

package com.example.Test;

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity
{
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    Views v = new Views(this);
    setContentView(v);
  }
}

Код:

package com.example.Test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created with IntelliJ IDEA.
 * User: eat
 * Date: 01.02.13
 * Time: 19:53
 * To change this template use File | Settings | File Templates.
 */
public class Views extends View implements View.OnTouchListener
{

  float px = 0;
  float py = 0;

  public Views(Context context)
  {
    super(context);
  }

  @Override
  public void onDraw(Canvas canvas)
  {
    super.onDraw(canvas);

    int width = this.getWidth();
    int height = this.getHeight();

    Paint paint = new Paint();
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.WHITE);
    canvas.drawPaint(paint);
    paint.setColor(Color.BLACK);
    paint.setTextSize(30);
    canvas.drawText("размер экрана", px, py, paint);
    canvas.drawText(" " + height, 10, 50, paint);
    canvas.drawText(" " + width, 10, 100, paint);
  }

  @Override
  public boolean onTouch(View v, MotionEvent event)
  {
    px = event.getX();
    py = event.getY();
    return true;
  }

}

Хочу чтобы канвас был на весь экран и попробовать отресовывать текст в точках касания.
Но как вызвать перересовку при касании незнаю. Можете пояснить немного мне как это сделать. и вообще правильней организовать код.
я так понимаю события касания лучше в оддельном классе? А отрисовку в другом.
Как мне обратиться потом к методу отрисовки?


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

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