Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
#1

Обращение к функции находящейся не в MainActivity - Программирование Android

29.03.2015, 18:16. Просмотров 1391. Ответов 26
Метки нет (Все метки)

Доброго времени суток! Имеется MainActivity.java и HybridMap.java. Мне необходимо при нажатии кнопки обратиться к процедуре в HybridMap. Процедура никакие данные не возвращает, просто нужно выполнение. Пробовал обращаться так:
Java
1
2
3
4
5
6
7
8
9
10
private HybridMap hbr;
//далее уже в обработчке нажатия кнопки
 imgBtn  = (ImageButton) findViewById(R.id.image_button);
        OnClickListener oclBtnIMG = new OnClickListener() {
            @Override
            public void onClick(View v) {
               hbr.dostoprLayers();
            }
        };
        imgBtn.setOnClickListener(oclBtnIMG);
Но при нажатии на кнопку происходит крах программы и ошибка с указанием этой строки. Помогите разобраться как правильно обратиться к этой функции...
Вот класс и моя функция в HybridMap.java:
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
public class HybridMap extends FrameLayout implements MapViewConstants {
//
//здесь обьявление различных переменных и констант
//
public HybridMap(Context context, AttributeSet attrs) {
        super(context, attrs);
//здесь  загрузка карты и ее настройка
}
 
public  void dostoprLayers(){
      GeoPoint point2 = new GeoPoint(gps.getLatitude(), gps.getLongitude());
 
      ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
    
      OverlayItem olItem2 = new OverlayItem("Here", "SampleDescription", point2);
      Drawable newMarker2 = this.getResources().getDrawable(R.drawable.flag_green);
      olItem2.setMarker(newMarker2);
      items.add(olItem2);
     
      this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
              new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                  @Override
                  public boolean onItemSingleTapUp(final int index,
                                                   final OverlayItem item) {
                    
                      mv.getOverlays().remove(mMyLocationOverlay);
                      mv.invalidate();
 
                      return true; 
                  }
 
                  @Override
                  public boolean onItemLongPress(final int index,
                                                 final OverlayItem item) {
                     
                      return false;
                  }
              }, resourceProxy);
      this.mv.getOverlays().add(this.mMyLocationOverlay);
      mv.invalidate();
  }
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2015, 18:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обращение к функции находящейся не в MainActivity (Программирование Android):

Обращение к textView из другого класса (не MainActivity) в AndroidStudio
Добрый вечер, у меня такой вопрос. В MainActivity можно обращаться к объектам,...

Не отрабатывает MainActivity
Здравствуйте! В общем, в моем приложении есть два Frament и Main Activity. В...

MainActivity AsyncTask
Добрый вечер. Ребята тут небольшая проблема. Мне нужно Заполнить...

Не создается MainActivity.java
Подскажите почему не создается форма по умолчанию?

Доступ к полям MainActivity
Добрый день, что-то не могу сообразить, как получить доступ к полям...

Переделать MainActivity в Fragment
Всем добра, друзья. Подскажите. Приложение работает со сторонним SDK. Создал...

26
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
29.03.2015, 19:31 #2
а что в логах пишет? Что то мне подсказывает что вы забыли
Java
1
hbr = new HybridMap(this);
сделать
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.03.2015, 09:38  [ТС] #3
а если до этого объявил уже
Java
1
private HybridMap hbr;
разве нужно прописывать
Java
1
hbr = new HybridMap(this);
?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
30.03.2015, 09:45 #4
конечно!

Java
1
private HybridMap hbr;
так ты объявляешь переменную, ее значение в данный момент null

Java
1
hbr = new HybridMap(this);
а вот так ты инициализируешь переменную, т.е. присваиваешь ей значение экземпляра класса
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.03.2015, 09:54  [ТС] #5
в логах пишет
Java
1
2
3
4
FATAL EXCEPTION: main
Process: моя_прога, PID: 1206
    java.lang.NullPointerException
            at моя_прога.MainActivity$2.onClick(MainActivity.java:283)
пробовал дописывать
Java
1
hbr = new HybridMap(this);
ен работает, подчеркивает красным "this" и пишет:
HybridMap (android.content.Context, AttributeSet) in HybridMap cannot be aplied to (android.view.View.OnClickListener)
Я работаю в Android Studio.
0
androbro
340 / 301 / 67
Регистрация: 17.10.2014
Сообщений: 887
30.03.2015, 09:55 #6
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
а если до этого объявил уже
ну объявлен то он объявлен...но не создан же
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
разве нужно прописывать
конечно нужно
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.03.2015, 09:58  [ТС] #7
ну понял, чайник я в JAVA и в C++ ну так он this говорит что неверная переменная
0
androbro
340 / 301 / 67
Регистрация: 17.10.2014
Сообщений: 887
30.03.2015, 10:00 #8
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
ен работает, подчеркивает красным "this" и пишет:
толи вынеси создание за пределы анонимного класса:
Java
1
hbr = new HybridMap(this);
либо используй:
Java
1
hbr = new HybridMap(текущая_активити.this);
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.03.2015, 10:40  [ТС] #9
в обоих случаях не работает
я так понял нужно сделать так:
Java
1
 hbr = new HybridMap(this.getClass, какойто аттрибут);
это я подумал из-за того что у нас
Java
1
HybridMap(Context context, AttributeSet attrs)
вот не могу понять какой аттрибут...

Добавлено через 34 минуты
Никак не получается... пробовал AttributeSet удалять из Hybrid Map, тогда вообще программа не запускалась, сразу ошибка выходила. В общем тупик...
0
androbro
340 / 301 / 67
Регистрация: 17.10.2014
Сообщений: 887
30.03.2015, 10:52 #10
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
вот не могу понять какой аттрибут...
для начала попробуйте создать вашу вьюху в xml а не программно
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
30.03.2015, 11:09 #11
this ты я так понимаю используешь внутри onClick

в данной момент это не тот контекст, который он хочет получить

как решение - создай переменную Context context; и в oncreate передай ему значение this.context = context

и далее везде используй эту переменную, где нужен контекст
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.03.2015, 11:23  [ТС] #12
Цитата Сообщение от androbro Посмотреть сообщение
для начала попробуйте создать вашу вьюху в xml а не программно
вы про mapView? она у меня и так в xml есть
Цитата Сообщение от fgtmenow Посмотреть сообщение
в oncreate передай ему значение this.context = context
и как это сделать?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
30.03.2015, 11:28 #13
Уважаемый, читайте как создать глобальную переменную в классе. Программировать тут вас никто не научит
0
androbro
340 / 301 / 67
Регистрация: 17.10.2014
Сообщений: 887
30.03.2015, 11:31 #14
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
пробовал AttributeSet удалять из Hybrid Map, тогда вообще программа не запускалась, сразу ошибка выходила. В общем тупик...
да что Вы говорите, у FrameLayout есть конструктор без AttributeSet.
Java
1
2
3
4
    public HybridMap(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.03.2015, 11:41  [ТС] #15
Цитата Сообщение от androbro Посмотреть сообщение
да что Вы говорите, у FrameLayout есть конструктор без AttributeSet.
Когда делал без AttributeSet выходила эта ошибка:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.моя_прога/com.моя_прога.MainActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class com.моя_прога.HybridMap
Цитата Сообщение от fgtmenow Посмотреть сообщение
Уважаемый, читайте как создать глобальную переменную в классе. Программировать тут вас никто не научит
извиняюсь за глупый вопрос
0
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
30.03.2015, 12:13 #16
создайте просто ниже вашего конструктора
Java
1
2
3
4
public HybridMap(Context context, AttributeSet attrs) {
        super(context, attrs);
//здесь  загрузка карты и ее настройка
}
еще один конструктор
Java
1
2
3
public HybridMap(Context context) {
        super(context);
}
и не будет выдавать ошибку
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.03.2015, 12:33  [ТС] #17
Цитата Сообщение от dajver Посмотреть сообщение
создайте просто ниже вашего конструктора

Java
1
2
3
4
public HybridMap(Context context, AttributeSet attrs) {
 super(context, attrs);
//здесь *загрузка карты и ее настройка
}
еще один конструктор

Java
1
2
3
public HybridMap(Context context) {
 super(context);
}
и не будет выдавать ошибку
если не вызывать функцию dostoprLayers(); из MainActivity то ошибок нет и все отлично работает, но стоит сделать запрос:
Java
1
2
3
4
5
6
7
8
9
10
11
 HybridMap hbr = new HybridMap(context);    //<----------------------
 imgBtn  = (ImageButton) findViewById(R.id.image_button);
 
        OnClickListener oclBtnIMG = new OnClickListener() {
            @Override
            public void onClick(View v) {
hbr.dostoprLayers();     //<-----------
            }
        };
        imgBtn.setOnClickListener(oclBtnIMG);
    }
то крах программы еще до запуска. В логах ссылается на
Java
1
2
3
 public HybridMap(Context context) {
        super(context);  // выделяет эту строку
    }
Java
1
HybridMap hbr = new HybridMap(context);// и вот эту строку выделяет
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
30.03.2015, 12:41 #18
SkN[i]lpl[e][r], покажите логи краша
0
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
30.03.2015, 12:44 #19
а какая хоть ошибка?
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.03.2015, 12:47  [ТС] #20
YuraAAA,
03-30 09:26:07.922 1902-1902/com.моя_прога E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.моя_прога, PID: 1902
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.моя_прога/com.моя_прога.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.view.ViewConfiguration.get(ViewConfiguration.java:352)
at android.view.View.<init>(View.java:3448)
at android.view.ViewGroup.<init>(ViewGroup.java:459)
at android.widget.FrameLayout.<init>(FrameLayout.java:93)
at com.моя_прога.HybridMap.<init>(HybridMap.java:310)
at com.моя_прога.MainActivity.<init>(MainActivity.java:290)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2101)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
************at android.app.ActivityThread.access$800(ActivityThread.java:135)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
************at android.os.Handler.dispatchMessage(Handler.java:102)
************at android.os.Looper.loop(Looper.java:136)
************at android.app.ActivityThread.main(ActivityThread.java:5001)
************at java.lang.reflect.Method.invokeNative(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:515)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
************at dalvik.system.NativeStart.main(Native Method)
0
30.03.2015, 12:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2015, 12:47
Привет! Вот еще темы с решениями:

Notification - запуск MainActivity
Здравствуйте! Есть Service который посылает запрос, парсит страницу и выводит...

SplashScreen не дает запуститься MainActivity
Здравствуйте!Есть предзагрузочная анимация в приложении и при запуске на...

Не могудобраться из MainActivity к etNum1, который в PlaceholderFragment
Помогите добраться из MainActivity к etNum1, который в PlaceholderFragment....

Как запустить метод Fragment из MainActivity?
есть фрагмент с картой, в нем метод: public void Sputnik(GoogleMap map) { ...


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

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

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