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

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

Войти
Регистрация
Восстановить пароль
 
ASKMAN
10 / 10 / 2
Регистрация: 07.02.2014
Сообщений: 110
#1

Image OnTouchListener crash - Программирование Android

25.01.2016, 14:38. Просмотров 284. Ответов 11
Метки нет (Все метки)

Делаю своё первое приложение под Android и столкнулся с следующей проблемой - программа вылетает при добавлении в неё следующего кода (colorPicker – это ImageView):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 colorPicker.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        colorPicker.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.color_picker_on_pressed));
                        break;
                    case MotionEvent.ACTION_UP:
                        colorPicker.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.color_picker));
                        break;
                }
                return true;
            }
        });
По задумке пока нажато на ImageView должно отображаться другое изображение. В чем может быть проблема?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2016, 14:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Image OnTouchListener crash (Программирование Android):

OnTouchListener - Программирование Android
Здравствуйте! Этот код работает как надо на Android 5.0+, но на 4.4 и ниже по какой-то причине не работает. final Button xy = new...

OnTouchListener - Программирование Android
Button start = (Button) findViewById(R.id.Start); start.setOnTouchListener(new OnTouchListener() { @Override ...

Не работает OnTouchListener - Программирование Android
Button start = (Button) findViewById(R.id.Start); start.setOnTouchListener(new OnTouchListener() { @Override public...

Создать OnTouchListener - Программирование Android
bt11 = (Button)findViewById(R.id.bt11); bt11.setOnTouchListener(myListener); Нужно создать рабочий myListener. Добавлено...

OnTouchListener и толстый дрожащий палец :) - Программирование Android
суть проблемы... жму в экран, двигаю, отпускаю, получаю события ACTION_DOWN, ACTION_UP, ACTION_MOVE... при длительном нажатии желаю...

Как правильно обработать onTouchListener - Программирование Android
В моем коде обработчик прикосновений работает как onClickListener. Помогите исправить. Нужно сделать так, чтоб при прикосновении на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 731
25.01.2016, 14:55 #2
Java
1
.setOnTouchListener(new OnTouchListener() {
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,747
Завершенные тесты: 1
25.01.2016, 14:58 #3
код ошибки надо
а почему не сделать смену картинки через селекторы?
примерно так
1. в папке res/drawable создаем файл, например selector.xml
XML
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_white" android:state_pressed="false"  />
    <item android:drawable="@drawable/ic_black" android:state_pressed="true" />
</selector>
названия картинок подставить свои
2. ImageView разметка такая
XML
1
2
3
4
5
    <ImageView
        android:clickable="true"
        android:background="@drawable/selector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
обязательно тег clickable
ASKMAN
10 / 10 / 2
Регистрация: 07.02.2014
Сообщений: 110
25.01.2016, 15:41  [ТС] #4
Valakin, Паблито,
Кликните здесь для просмотра всего текста
01-25 12:25:19.457 8480-8480/com.khomyak.rgbledcontroller E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.khomyak.rgbledcontroller, PID: 8480
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.khomyak.rgbledcontroller/com.khomyak.rgbledcontroller.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setOnTouchListener(android.view.View$OnTouchListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setOnTouchListener(android.view.View$OnTouchListener)' on a null object reference
at com.khomyak.rgbledcontroller.MainActivity.onCreate(MainActivity.java:55)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)*
at android.app.ActivityThread.-wrap11(ActivityThread.java)*
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)*
at android.os.Handler.dispatchMessage(Handler.java:102)*
at android.os.Looper.loop(Looper.java:148)*
at android.app.ActivityThread.main(ActivityThread.java:5417)*
at java.lang.reflect.Method.invoke(Native Method)*
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)*
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)*
Вот код ошибки. Такой вывер с кодом связан с тем что что на ACTION_UP будет так же Intent.
Цитата Сообщение от Valakin Посмотреть сообщение
.setOnTouchListener(new OnTouchListener() {
Проходил этот вариант - пишет, что не может вызвать этот метод.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
25.01.2016, 15:49 #5
ASKMAN, ImageView нужно сначала инициализировать, а потом уже вешать не него листенер.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 731
25.01.2016, 15:50 #6
видимо в коде нет такой строки
Java
1
ImageView colorPicker= (ImageView) findViewById(R.id.ImageView1);
ASKMAN
10 / 10 / 2
Регистрация: 07.02.2014
Сообщений: 110
25.01.2016, 16:09  [ТС] #7
Valakin, Spelcrawler,нет, инициализация есть, и она была с самого начала. Только что понял, что проблема не в одном ImageView. Почему то нет доступа ни до одного элемента - их находит и связывает с переменными, но как только пытаюсь что-то с каким либо элементом делать, то приложение останавливается
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
25.01.2016, 16:11 #8
Цитата Сообщение от ASKMAN Посмотреть сообщение
инициализация есть
Не верю, покажите весь код.
ASKMAN
10 / 10 / 2
Регистрация: 07.02.2014
Сообщений: 110
25.01.2016, 16:23  [ТС] #9
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Не верю
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package com.khomyak.rgbledcontroller;
 
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.os.Bundle;
 
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MotionEvent;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.Toast;
 
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
 
 
import java.util.HashMap;
import java.util.Map;
 
public class MainActivity extends AppCompatActivity {
    private Button connect;
    private Button send;
    private Switch modeSelect;
    private ImageView colorPicker;
    private CheckBox[] sections;
    private BluetoothAdapter BA;
    final int REQUEST_ENABLE_BT = 1;
    final Map <String,String> SECTION_CODE = InitMap();
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
     */
    private GoogleApiClient client;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sections    = new CheckBox[5];
        connect     = (Button) findViewById(R.id.connect);
        send        = (Button) findViewById(R.id.send);
        modeSelect  = (Switch) findViewById(R.id.mode);
        colorPicker = (ImageView) findViewById(R.id.colorpicker);
        sections[0] = (CheckBox) findViewById(R.id.section1);
        sections[1] = (CheckBox) findViewById(R.id.section2);
        sections[2] = (CheckBox) findViewById(R.id.section3);
        sections[3] = (CheckBox) findViewById(R.id.section4);
        sections[4] = (CheckBox) findViewById(R.id.section5);
        BA = BluetoothAdapter.getDefaultAdapter();
        if (BA == null)
        {
            Toast.makeText(this,"Додаток потребує наявності блютуз",Toast.LENGTH_LONG).show();
            finish();
        }
        if (!BA.isEnabled()) {
            Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(turnOn, REQUEST_ENABLE_BT);
        }
        colorPicker.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        colorPicker.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.color_picker_on_pressed));
                        break;
                    case MotionEvent.ACTION_UP:
                        colorPicker.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.color_picker));
                        break;
                }
                return true;
            }
        });
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode==REQUEST_ENABLE_BT && resultCode==RESULT_CANCELED) {
            Toast.makeText(this,"Додаток потребує блютуз з\'єднання",Toast.LENGTH_LONG).show();
            finish();
        }
        if (requestCode==REQUEST_ENABLE_BT && resultCode==RESULT_OK) {
            colorPicker.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.color_picker));
            colorPicker.setClickable(true);
        }
    }
 
    public void sendData(View v)
    {
        String currentSegment = new String();
        for (int i=1;i<5;i++) if(sections[i].isChecked())currentSegment+=sections[i].getText();
        //Toast.makeText(getApplicationContext(),sections[0].getText(),Toast.LENGTH_LONG).show();
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
 
    private Map<String, String> InitMap() {
        Map <String,String> aMap = new HashMap<String, String>();
        aMap.put("1","a");
        aMap.put("2","b");
        aMap.put("3","c");
        aMap.put("4","d");
        aMap.put("5","e");
        aMap.put("12","f");
        aMap.put("13","g");
        aMap.put("14","h");
        aMap.put("15","i");
        aMap.put("23","j");
        aMap.put("24","k");
        aMap.put("25","l");
        aMap.put("34","m");
        aMap.put("35","n");
        aMap.put("45","o");
        aMap.put("123","p");
        aMap.put("124","q");
        aMap.put("125","r");
        aMap.put("234","s");
        aMap.put("235","t");
        aMap.put("345","u");
        aMap.put("1234","v");
        aMap.put("1235","w");
        aMap.put("2345","x");
        aMap.put("12345","y");
        return aMap;
    }
 
}
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
25.01.2016, 16:25 #10
ASKMAN, а где setContentView()? Должен быть в onCreate() после super.onCreate().
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,747
Завершенные тесты: 1
25.01.2016, 16:25 #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
эта строчка setContentView(R.layout.activity_main);
должна идти ДО всех инициализаций
ASKMAN
10 / 10 / 2
Регистрация: 07.02.2014
Сообщений: 110
25.01.2016, 16:37  [ТС] #12
Паблито, Spelcrawler, Супер, Спасибо) начав работать с Android мне почему то setContentView напомнил setLayout с Qt от и нарисовалась параллель.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2016, 16:37
Привет! Вот еще темы с ответами:

OnTouchListener не работает на низких версиях Android - Программирование Android
Ребят, молю о помощи. Вобщем этот код адекватно работает на 5.0+, но на 4.2 полная каша... При нажатии каким-то чудом вызывается...

Анализ crash-лога - Программирование Android
Программа в случае crash'а отправляет данные мне на сервер. Время от времени от пользователей получаю странные логи о...

Получить crash reports - Программирование Android
Добрый день, товарищи форумчане! Наконец то пришло желание, а самое главное время, получать crash report'ы... Мне на данный...

Crash Activity при присвоении ItemList-у Adapter-a - Программирование Android
Activity import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import...


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

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

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