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

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

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

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

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

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

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

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

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

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

Решение

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

Решение

Java
1
//   drawView.setOnTouchListener(this);//НЕ РАБОТАЕТ
Каждый создаваемый экземпляр класса вешает слушателя на определённый и единственный экземпляр этого класса - этакого козла отпущения в классе. Но этот козёл еще даже в журнале не записан.
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
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

Ссылка типа интерфейса или класса
Привет. Разбираю пример. Там объявлена ссылка такая: LoginPresenter...

Создание объекта класса
public class MyClass { static int Variable = 1; } //создаю первый...

Заполнение объекта класса FragmentManager
Здравствуйте, пытаюсь заполнить mFragmentManager, но не получается. Выдаёт...


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

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

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