Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Роmaн
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 8
#1

Как реализовать обращение из SurfacView к TextView в основной Активити - Программирование Android

01.10.2013, 17:13. Просмотров 599. Ответов 8
Метки нет (Все метки)

Всем Добрый День! Не знаю правильно или нет, но хотел сделать разметку поделив экран на две области, нижняя область отображает графику, в верхней отображение статистики в элементе TextView.
Проблема обращения к TextView в основном потоке из класса MainGame, спотыкается на tv.setText("счетчик кликов"); Подскажите плиз, как сделать правильно? Заранее благодарен!

Разметка экрана:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:weightSum="1" >
 
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="0.7" >
 
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />
 
    </LinearLayout>
 
    <LinearLayout
        android:id="@+id/gamelayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="0.3"
        android:orientation="vertical" >
 
    </LinearLayout>
 
</LinearLayout>
Основная Активити:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.example.battlesea;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.TextView;
public class Game  extends Activity{
    private static final String TAG = "Battle Sea" ;
    public static final String KEY_DIFFICULTY="Difficulty Level";
    public static final int DIFFICULTY_EASY = 0;
    public static final int DIFFICULTY_MEDIUM = 1;
    public static final int DIFFICULTY_HARD = 2;
    private MainGame gameView;
    private LinearLayout layout;
     private TextView tv;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate" );
        int diff = getIntent().getIntExtra(KEY_DIFFICULTY,
                DIFFICULTY_EASY);
        
        setContentView(R.layout.main_game);
        layout=(LinearLayout) findViewById(R.id.gamelayout);
        gameView = new MainGame(this);
        
        layout.addView(gameView);
        gameView.requestFocus();
    }
    
   
}
Класс отображения графики

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package com.example.battlesea;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.TextView;
 
public class MainGame extends SurfaceView implements SurfaceHolder.Callback {
     private MainThread thread;
     private int[] BenArr;
     private float width; // ширина одного тайла
        private float height; // высота одного тайла
        private int selX; // координата x выделенной области
        private int selY; // координата y выделенной области
        private static final String TAG = "battle";
        private TextView tv;
        
public MainGame(Context context) {  
super(context);
getHolder().addCallback(this);
BenArr = new int[100];
closeAllCell();
TextView tv = (TextView) findViewById(R.id.textView1);
thread = new MainThread(getHolder(), this);
setFocusable(true);
}
 
private void closeAllCell(){
    for (int i=0; i<100;i++){
        BenArr[i]=0;
    }
    
}
 
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    width = w / 10f;
    height = h / 10f;
   
    super.onSizeChanged(w, h, oldw, oldh);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
 
@Override
public void surfaceCreated(SurfaceHolder holder) {
     thread.setRunning(true);
      thread.start();
}
 
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
     boolean retry = true;
      while (retry) {
       try {
        thread.join();
        retry = false;
       } catch (InterruptedException e) {
        // пытаемся снова остановить поток thread
       }
      }
}
 
@Override
public boolean onTouchEvent(MotionEvent event) {
     if (event.getAction() == MotionEvent.ACTION_DOWN) {
       selX=(int) (event.getX() / width);
       selY=(int) (event.getY() / height);
       Log.d(TAG, "Coords: x=" + (int) (event.getX() / width) + ",y=" + (int) (event.getY() / height));
       BenArr[selY*10+selX]=1;
       tv.setText("счетчик кликов"); // Здесь выдает ошибку!!!
     }
     return super.onTouchEvent(event);
    }
 
 
 
@Override
protected void onDraw(Canvas canvas) {
    
    for (int i=0; i<10;i++){
        for (int k=0; k<10; k++){
             switch (BenArr[i*10+k])
                {
                  case 0:    
                    
                     Bitmap bitmap_none = BitmapFactory.decodeResource(getResources(), R.drawable.none);
                
                      Rect source_none = new Rect(0, 0, bitmap_none.getWidth(), bitmap_none.getHeight());
                     Rect bitmapRect_none = new Rect((int) (k * width),(int) (i * height), (int) (k* width + width),(int) (i * height + height));
                     canvas.drawBitmap(bitmap_none, source_none,bitmapRect_none, null);
        
                      break;
                  case 1:
                     Bitmap bitmap_destr = BitmapFactory.decodeResource(getResources(), R.drawable.animatdestr0001);
                        
                      Rect source_destr = new Rect(0, 0, bitmap_destr.getWidth(), bitmap_destr.getHeight());
                     Rect bitmapRect_destr = new Rect((int) (k * width),(int) (i * height), (int) (k* width + width),(int) (i * height + height));
                     canvas.drawBitmap(bitmap_destr, source_destr,bitmapRect_destr, null);
                      break;
                 
                }
          
        }
    }
}
 
 
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2013, 17:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как реализовать обращение из SurfacView к TextView в основной Активити (Программирование Android):

Ссылка из textView на другую активити - Программирование Android
Добрый день, Есть textView в которое выводится различная текстовая информация из базы данных. Иногда внутри текста идет что-то вроде:...

Обращение к NULL TextView - Программирование Android
У меня есть TextView описанный в XML в GridLayout. И есть ListView который этими GridLayout и заполняется. Возникает исключение....

Обращение к фрагменту вне активити - Программирование Android
Здравствуйте, форумчане! Назрел такой вот вопрос: создан класс BannerFragment, унаследованный от фрагмента. В нём переопределён...

Обращение к элементам другой Активити - Программирование Android
Есть xml-файл главной активити main.xml который содержит поле ввода &lt;EditText android:id=&quot;@+id/edPhone&quot; ...

Обращение к элементам фрагмента из активити - Программирование Android
Есть необходимость в программе менять значение TextView находящегося во фрагменте. Фрагмент должен выводится в контейнер. И затем я...

Обращение к элементам активити из другого класса - Программирование Android
Добрый день. Ломаю голову битый час, все не могу понять, почему у меня не получается. Опишу по шагам. Создал проект андроид (в эклипсе),...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 17:14 #2
смотрите логи.
0
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.10.2013, 17:18 #3
Java
1
TextView tv = (TextView) findViewById(R.id.textView1);
tv == null, очевидно же, что там его нет.
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 17:34 #4
действительно, он же не находится внутри SurfaceView.
0
Роmaн
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 8
01.10.2013, 17:36  [ТС] #5
Дык, а в разметке я же прописываю, в основной активити проблем нет с отображением, как передать это сообщение в основную активити?
0
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.10.2013, 17:58 #6
Лично я, сделал бы вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.example.llalalal;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
 
import com.example.llalalal.MainGame.OnTextUpdateListener;
 
public class Game extends Activity implements OnTextUpdateListener {
 
    private TextView tv;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textView1);
    }
    
    @Override
    public void onTextUpdate(String text) {
        tv.setText(text);
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.example.llalalal;
 
import android.app.Activity;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
 
public class MainGame extends SurfaceView implements SurfaceHolder.Callback {
    
    public interface OnTextUpdateListener {
        void onTextUpdate(String text);
    }
 
    private OnTextUpdateListener mOnTextUpdateListener;
    
    public MainGame(Activity context) {
        super(context);
        try {
            mOnTextUpdateListener = (OnTextUpdateListener)context;
        } catch(ClassCastException e) {
            throw new ClassCastException("Activity must implement OnTextUpdateListener");
        }
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mOnTextUpdateListener.onTextUpdate("счетчик кликов");
        }
        return super.onTouchEvent(event);
    }
 
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
 
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
 
}
1
Роmaн
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 8
02.10.2013, 13:58  [ТС] #7
Спасибо за идею, пробовал как вы предлагаете, ошибку не выдает, но никаких изменений с TextView не происходит
0
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
02.10.2013, 15:17 #8
Цитата Сообщение от Роmaн Посмотреть сообщение
но никаких изменений с TextView не происходит
Естественно, туда передается один и тот же текст.

Java
1
2
3
4
5
6
7
8
@Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mOnTextUpdateListener.onTextUpdate("x=" + event.getX() + 
                    ", y=" + event.getY());
        }
        return super.onTouchEvent(event);
    }
А так то, все работает. Apk файл даже слепил, для демонстрации.
1
Вложения
Тип файла: zip Aaaaa.zip (238.6 Кб, 3 просмотров)
Роmaн
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 8
03.10.2013, 10:37  [ТС] #9
Огромное Спасибо!!! Все получилось, только добавил в основную активити
Java
1
2
3
4
5
6
.....
layout=(LinearLayout) findViewById(R.id.lay);
     .....
        game=new MainGame(this);
        layout.addView(game);
.....
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2013, 10:37
Привет! Вот еще темы с ответами:

Обращение к textView из другого класса (не MainActivity) в AndroidStudio - Программирование Android
Добрый вечер, у меня такой вопрос. В MainActivity можно обращаться к объектам, а если в другом классе требуется, допустим, найти объект...

Как вызвать метод в активити классе из обычного не активити класса? - Программирование Android
Есть активити в котором вводятся логин и пароль. При нажатии кнопки &quot;войти&quot; в отдельном классе &quot;сокетсервер&quot;(+в отдельном потоке)...

Через что лучше всего реализовать Кликабельный TextView - Программирование Android
Доброго времени суток. Натолкните на мысль пожалуйста, через что лучше всего реализовать. Получаю список в файлов в папке, вывожу...

На телефоне highscreen 3 на всех активити происходит быстрый самовозврат к главной активити - Программирование Android
Сделал меню в виде ListView. При клике на меню запускаются активити. На эмуляторе работает, на телефоне моем LG все работает. На телефоне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.10.2013, 10:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru