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

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

Войти
Регистрация
Восстановить пароль
 
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 947
#1

Ссылка на экземпляр объекта внутреннего класса - Программирование Android

22.11.2015, 20:36. Просмотров 316. Ответов 6
Метки нет (Все метки)

Интересная вещь-если написать внутренний класс, например, DrawView, создать его в onCreate MainActivity, а потом, используя ссылку на него в конструкторе этого вложенного класса попытаться повесить слушателя(drawView.setOnTouchListener) - то приложение крашится, а если написать просто setOnTouchListener (без явной ссылки на экземпляр), то все нормально. Почему так происходит? Спасибо заранее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2015, 20:36
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ссылка на экземпляр объекта внутреннего класса (Программирование Android):

Static поле у внутреннего класса - Программирование Android
Есть класс, скажем Building, в нем есть еще один класс, скажем Floor. И вот этот Building хранит несколько экземпляров класса Floor. Что...

Реализация слушателя в виде анонимного внутреннего класса - Программирование Android
Здравствуйте. Я новичёк в Андройде. Начал своё изучение с книги "Программирование под андройд" авторов Брайана Харди, Билли Филлипса. Я...

Передать экземпляр класса в другой класс - Программирование Android
Подскажите как сделать класс который будет принимать как входной параметр, экземпляр других классов?

Один экземпляр класса для всех активити - Программирование Android
Как это можно реализовать?Если класс не поддается сериализации.

Как получить ссылку на экземпляр класса активности из ресивера - Программирование Android
Имеется ресивер, в нем объявлен интерфейс. Его методы определяется в MainActivity. Необходимо произвести обратный возов метода интерфейса....

Создание объекта класса - Программирование Android
public class MyClass { static int Variable = 1; } //создаю первый объект new MyClass(); //здесь MyClass.Variable = 1 ...

6
Pablito
2631 / 2113 / 656
Регистрация: 12.05.2014
Сообщений: 7,398
Завершенные тесты: 1
23.11.2015, 12:07 #2
показать код не?
с логами
1
Spelcrawler
531 / 501 / 111
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
23.11.2015, 12:47 #3
Цитата Сообщение от danek130995 Посмотреть сообщение
используя ссылку на него в конструкторе этого вложенного класса
Т.е. чтобы создать экземпляр класса нужно создать экземпляр класса?
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 947
23.11.2015, 13:19  [ТС] #4
Spelcrawler, нет, экземпляр внутреннего класса создается во внешем(в Main Activity).

Паблито,вот код:
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
public class MainActivity extends AppCompatActivity  {
 
    DrawView drawView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        drawView = new DrawView(this);
        setContentView(drawView);
    }
 
 
    class DrawView extends View implements View.OnTouchListener {
 
        Paint p;
        Paint pBlack;
        Paint pGray;
        Paint pWhite;
        Path path;
        Path pathDst;
        Matrix matrix;
        RectF rectf;
        float[] src;
        float[] dst;
        float[] dst2;
        int points = 1;
 
 
        public DrawView(Context context) {
            super(context);
            setOnTouchListener(this);// РАБОТАЕТ
         //   drawView.setOnTouchListener(this);//НЕ РАБОТАЕТ
            p = new Paint();
            p.setStrokeWidth(3);
            p.setStyle(Paint.Style.STROKE);
 
            pGray = new Paint();
            pGray.setColor(Color.GRAY);
            pGray.setStrokeWidth(3);
 
            pBlack = new Paint();
            pBlack.setColor(Color.BLACK);
            pBlack.setStrokeWidth(3);
 
            pWhite = new Paint();
            pWhite.setColor(Color.WHITE);
            pWhite.setStrokeWidth(3);
 
            path = new Path();
            pathDst = new Path();
            matrix = new Matrix();
 
            rectf = new RectF(100,100,200,200);
            src = new float[]{100,100,200,200,200,100,100,200};
            dst = new float[]{50,300,250,500,230,350,40,550};
            dst2 = new float[]{400,200,500,200,440,100,440,230};
        }
 
 
 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
           invalidate();
       // Log.d(LOG_TAG, "onTouch");
        return true;
    }
 
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawARGB(80, 102, 204, 255);
 
            // зеленый квадрат
            path.reset();
            path.addRect(rectf, Path.Direction.CW);
            p.setColor(Color.GREEN);
            canvas.drawPath(path, p);
            canvas.drawLine(src[0], src[1], src[2], src[3], pBlack);
            canvas.drawLine(src[0], src[1], src[4], src[5], pGray);
            canvas.drawLine(src[0], src[1], src[6], src[7], pWhite);
 
            // синий квадрат
            // преобразование
            matrix.setPolyToPoly(src, 0, dst, 0, points);
            path.transform(matrix, pathDst);
            // рисование
            p.setColor(Color.BLUE);
            canvas.drawPath(pathDst, p);
            canvas.drawLine(dst[0], dst[1], dst[2], dst[3], pBlack);
            canvas.drawLine(dst[0], dst[1], dst[4], dst[5], pGray);
            canvas.drawLine(dst[0], dst[1], dst[6], dst[7], pWhite);
 
            // красный квадрат
            // преобразование
            matrix.setPolyToPoly(src, 0, dst2, 0, points);
            path.transform(matrix, pathDst);
            // рисование
            p.setColor(Color.RED);
            canvas.drawPath(pathDst, p);
            canvas.drawLine(dst2[0], dst2[1], dst2[2], dst2[3], pBlack);
            canvas.drawLine(dst2[0], dst2[1], dst2[4], dst2[5], pGray);
            canvas.drawLine(dst2[0], dst2[1], dst2[6], dst2[7], pWhite);
        }
 
    }
}

Логи:
11-23 13:19:20.431 14030-14030/p1451matrixtransform2.develop.startandroid.ru.p1451_matrixtransform2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: p1451matrixtransform2.develop.startandroid.ru.p1451_matrixtransform2, PID: 14030
java.lang.RuntimeException: Unable to start activity ComponentInfo{p1451matrixtransform2.develop.startandroid.ru.p1451_matrixtransform2/p1451matrixtransform2.develop.startandroid.ru.p1451_matrixtransform2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void p1451matrixtransform2.develop.startandroid.ru.p1451_matrixtransform2.MainActivity$DrawView.setOnTouchListener(android.vi ew.View$OnTouchListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
at android.app.ActivityThread.access$800(ActivityThread.java:156)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5389)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void p1451matrixtransform2.develop.startandroid.ru.p1451_matrixtransform2.MainActivity$DrawView.setOnTouchListener(android.vi ew.View$OnTouchListener)' on a null object reference
at p1451matrixtransform2.develop.startandroid.ru.p1451_matrixtransform2.MainActivity$DrawView.<init>(MainActivity.java:46)
at p1451matrixtransform2.develop.startandroid.ru.p1451_matrixtransform2.MainActivity.onCreate(MainActivity.java:22)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)*
at android.app.ActivityThread.access$800(ActivityThread.java:156)*
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)*
at android.os.Handler.dispatchMessage(Handler.java:102)*
at android.os.Looper.loop(Looper.java:211)*
at android.app.ActivityThread.main(ActivityThread.java:5389)*
at java.lang.reflect.Method.invoke(Native Method)*
at java.lang.reflect.Method.invoke(Method.java:372)*
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)*
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)*
0
Spelcrawler
531 / 501 / 111
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
23.11.2015, 13:22 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от danek130995 Посмотреть сообщение
нет, экземпляр внутреннего класса создается во внешем(в Main Activity).
эмммм... ну как бы да. Как он создается? Вы не думали что происходит в drawView = new DrawView(this);? - вызывается конструктор. А что пытается сделать конструктор? - использовать экземпляр, который сам только что создает. Как это должно работать то?
1
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
23.11.2015, 13:32 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Java
1
//   drawView.setOnTouchListener(this);//НЕ РАБОТАЕТ
Каждый создаваемый экземпляр класса вешает слушателя на определённый и единственный экземпляр этого класса - этакого козла отпущения в классе. Но этот козёл еще даже в журнале не записан.
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 947
23.11.2015, 13:57  [ТС] #7
Armagedo, Spelcrawler,ойй.. точно, я пытаюсь в конструкторе использовать ссылку на экземпляр класса, которую сам же и создаю. Лол. Затупил, спасибо.


Armagedo, не понял про козла. А под козлом вы имеете ввиду слушателя или экземпляр класса?

Добавлено через 7 минут
Armagedo, а, тут же экземпляр этого класса сам и будет слушателем, т.е. козлом. Спасибо
0
23.11.2015, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2015, 13:57
Привет! Вот еще темы с ответами:

Почта под Android: выбрасывается исключение при создании объекта класса URLName - Программирование Android
Всем доброго времени суток. Помогите, плз, разобраться с почтой. Моя программа под Андроид должна лезть на почту, забирать оттуда файлы и...

Как получить доступ к методам объекта класса наследуемого от Activity, когда он выводится во вкладку - Программирование Android
В главном Активити создаются вкладки на котовые выводятся другие активити. @Override public void onCreate(Bundle...

Не указана ссылка на экземпляр объекта - C#
ругается на строку 81, типа не указанна ссылка на экземпляр объекта, как исправить ? string shifr=richTextBox1.Text; string mas =...

Ссылка не указывает на экземпляр объекта - C#
Есть класс для зашифровки и дешифровке текста при зашифровке(GenText(&quot;Ё&quot;)) - все нормально но при дешифровки (ReGenText(&quot;RU00S&quot;)) -...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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