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

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

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

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

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

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

Android Почта под Android: выбрасывается исключение при создании объекта класса URLName
Класс: Хочу из класса WorkFiles получить доступ к функционалу класса WorkDB. Android
Android Ссылка на класс
Android Dropbox Datastore API не создается экземпляр DbxAccountManager
Android Вызов класса из класса
Android Реализация слушателя в виде анонимного внутреннего класса
Передать экземпляр класса в другой класс Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
23.11.2015, 12:07     Ссылка на экземпляр объекта внутреннего класса #2
показать код не?
с логами
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
23.11.2015, 12:47     Ссылка на экземпляр объекта внутреннего класса #3
Цитата Сообщение от danek130995 Посмотреть сообщение
используя ссылку на него в конструкторе этого вложенного класса
Т.е. чтобы создать экземпляр класса нужно создать экземпляр класса?
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 836
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.view.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.view.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)*
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
23.11.2015, 13:22     Ссылка на экземпляр объекта внутреннего класса #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от danek130995 Посмотреть сообщение
нет, экземпляр внутреннего класса создается во внешем(в Main Activity).
эмммм... ну как бы да. Как он создается? Вы не думали что происходит в drawView = new DrawView(this);? - вызывается конструктор. А что пытается сделать конструктор? - использовать экземпляр, который сам только что создает. Как это должно работать то?
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
23.11.2015, 13:32     Ссылка на экземпляр объекта внутреннего класса #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Java
1
//   drawView.setOnTouchListener(this);//НЕ РАБОТАЕТ
Каждый создаваемый экземпляр класса вешает слушателя на определённый и единственный экземпляр этого класса - этакого козла отпущения в классе. Но этот козёл еще даже в журнале не записан.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2015, 13:57     Ссылка на экземпляр объекта внутреннего класса
Еще ссылки по теме:

Static поле у внутреннего класса Android
Как получить ссылку на экземпляр класса активности из ресивера Android
Создание объекта класса Android
Как получить доступ к методам объекта класса наследуемого от Activity, когда он выводится во вкладку Android
Один экземпляр класса для всех активити Android

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

Или воспользуйтесь поиском по форуму:
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 836
23.11.2015, 13:57  [ТС]     Ссылка на экземпляр объекта внутреннего класса #7
Armagedo, Spelcrawler,ойй.. точно, я пытаюсь в конструкторе использовать ссылку на экземпляр класса, которую сам же и создаю. Лол. Затупил, спасибо.


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

Добавлено через 7 минут
Armagedo, а, тут же экземпляр этого класса сам и будет слушателем, т.е. козлом. Спасибо
Yandex
Объявления
23.11.2015, 13:57     Ссылка на экземпляр объекта внутреннего класса
Ответ Создать тему
Опции темы

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