Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
danek130995
25 / 25 / 1
Регистрация: 25.05.2014
Сообщений: 994
1

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

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

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

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

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

Ссылка на объект не указывает на экземпляр объекта (Методы класса)
Проблема в реализации методов из классов прорисовки фигуры using System; using...

Создать в мэйн методе экземпляр внутреннего класса
package ua.lviv.lgs; public class Task_5 { public static void main(String args) { ...

Как создать экземпляр внутреннего класса в родительском классе
Как создать экземпляр этого класса в статическом методе main. public class Parent { class...

6
Pablito
2856 / 2270 / 766
Регистрация: 12.05.2014
Сообщений: 7,967
Завершенные тесты: 1
23.11.2015, 12:07 2
показать код не?
с логами
1
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,667
Завершенные тесты: 1
23.11.2015, 12:47 3
Цитата Сообщение от danek130995 Посмотреть сообщение
используя ссылку на него в конструкторе этого вложенного класса
Т.е. чтобы создать экземпляр класса нужно создать экземпляр класса?
1
danek130995
25 / 25 / 1
Регистрация: 25.05.2014
Сообщений: 994
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 / 113
Регистрация: 12.03.2014
Сообщений: 1,667
Завершенные тесты: 1
23.11.2015, 13:22 5
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

Цитата Сообщение от danek130995 Посмотреть сообщение
нет, экземпляр внутреннего класса создается во внешем(в Main Activity).
эмммм... ну как бы да. Как он создается? Вы не думали что происходит в drawView = new DrawView(this);? - вызывается конструктор. А что пытается сделать конструктор? - использовать экземпляр, который сам только что создает. Как это должно работать то?
1
Armagedo
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
23.11.2015, 13:32 6
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

Java
1
//   drawView.setOnTouchListener(this);//НЕ РАБОТАЕТ
Каждый создаваемый экземпляр класса вешает слушателя на определённый и единственный экземпляр этого класса - этакого козла отпущения в классе. Но этот козёл еще даже в журнале не записан.
1
danek130995
25 / 25 / 1
Регистрация: 25.05.2014
Сообщений: 994
23.11.2015, 13:57  [ТС] 7
Armagedo, Spelcrawler,ойй.. точно, я пытаюсь в конструкторе использовать ссылку на экземпляр класса, которую сам же и создаю. Лол. Затупил, спасибо.


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

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

Ссылка и экземпляр объекта
namespace monolife { public partial class GoodGame : Form { public static...

Ссылка не указывает на экземпляр объекта
Доброго времени суток. В программе используется List(храниться в Program, Group - самописный...

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


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

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

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