Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Android, Activity, проблема доступа, enclosing class 
:(
    Опции темы
Burka
Дата 7.10.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



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

сначала вызывается метод InitSDK
в нем в  MNDirect.init передается класс-обработчик событий MNEventHandler 
потом в приложении вызывается метод ShowSDk которое создает активити DashBoardActivity 
Проблема в том что я немогу в классе MNEventHandler закрыть активити DashBoardActivity 
(или если описать класс MNEventHandler внутри DashBoardActivity , то я не могу передать в  MNDirect.init обработчик собыйтий)

подскажите как можно решить проблему?

Код

class PlayPhone
{
    Activity DashActivity;

    public class MNEventHandler extends MNDirectEventHandlerAbstract {
        @Override
            public void mnDirectViewDoGoBack() {
                    DashBoardActivity.this.Close();
                }
    }
        
    String puID = "12312-123123-213-123-123";
    int gameID = 1233;
    View mainView;
    
     private final Runnable InitSDK = new Runnable()
    {
        @Override
        public void run()
        {
                MNDirectUIHelper.setHostActivity(LoaderActivity.m_Activity);
                             MNDirect.init(gameID,puID,new MNEventHandler(),LoaderActivity.m_Activity);

        }
    };

public int ShowSDk()
    {
        try
        {

        LoaderActivity.m_Activity.runOnUiThread(new Runnable()
                    {public void run ()    
                    {
                            Intent intent = new Intent(LoaderActivity.m_Activity,com.my.DashBoardActivity.class);
                            intent.setClass(LoaderActivity.m_Activity, DashBoardActivity.class);
                            LoaderActivity.m_Activity.startActivity(intent);
                    }    }); 
                    return 1;
        }
        catch (Exception e)
        {
            return 0;
        }
       
    }
...


код самой активити
Код

ublic class DashBoardActivity extends Activity 
    {
        @Override
        protected void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);  
            setContentView(MNDirect.getView());
            MNDirect.getView().requestFocus();
            MNDirectButton.show();
        }    
        
        @Override
        protected void onDestroy () 
        {
          ViewGroup vg = (ViewGroup)(MNDirect.getView().getParent());
         if (vg != null)
                {
                        vg.removeView(MNDirect.getView());
                }
        super.onDestroy();
        }
        
        public void Close()
        {
            finish();
        }
    }



--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
ivanovpv
Дата 7.10.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



А почему нельзя в конструкторе MNEventHandler передать активити которое ему надо будет потом закрыть? Тогда все вроде складывается, не?


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Burka
Дата 7.10.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата(ivanovpv @ 7.10.2011,  20:26)
А почему нельзя в конструкторе MNEventHandler передать активити которое ему надо будет потом закрыть? Тогда все вроде складывается, не?

а можешь показать как? я пробовал но что то у меня не получалось


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Burka
Дата 9.10.2011, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



я пробовал сохранять ссылку на активити, но при компиляции так же ошибка enclosing class
Код


Activity act;

        LoaderActivity.m_Activity.runOnUiThread(new Runnable()
                    {public void run ()    
                    {
                            Intent intent = new Intent(LoaderActivity.m_Activity,com.my.DashBoardActivity.class);
                            intent.setClass(LoaderActivity.m_Activity, DashBoardActivity.class);
                            LoaderActivity.m_Activity.startActivity(intent);
                            act = DashBoardActivity.this;



--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Burka
Дата 11.10.2011, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



подскажите, кто-нибудь, рабочий вариант, я сам в яве не силен, а очень нужно


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
ivanovpv
Дата 11.10.2011, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Цитата(Burka @  9.10.2011,  03:00 Найти цитируемый пост)
я пробовал сохранять ссылку на активити, но при компиляции так же ошибка enclosing class

Ненавижу анонимные классы - вынеси в нормальный класс в отдельный файл, разложи по полочкам и все будет. 

Код

 public class MNEventHandler extends MNDirectEventHandlerAbstract 
{
         private Activity activity;

         public MNEventHandler(Activity activity) 
         {
               this.activity=activity;
          }

        @Override
         public void mnDirectViewDoGoBack() 
         {
             DashBoardActivity.this.Close();
          }

          public void finishActivity()
          {
               if(activity!=null)
                    activity.finish(); 
               activity=null;
          }

}


Теперь вызываем:
Код

MNDirect.init(gameID,puID,new MNEventHandler(DashActivity),LoaderActivity.m_Activity);


В общем как то так...

P.S. Да и кстати, именования переменных у вас не совсем джаверское... Почитайте документацию


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Burka
Дата 11.10.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



ivanovpv, спасибо за помощь. 
но у меня не получается один момент.

здесь мы передаем активити DashActivity
Код

MNDirect.init(gameID,puID,new MNEventHandler(DashActivity),LoaderActivity.m_Activity);


допустим я его создаю так
Код

class PlayPhone
{
    Activity DashActivity;
        
    String puID = "7931e";
    int gameID = 11300;
    View mainView;
    
     private final Runnable InitSDK = new Runnable()
    {
        @Override
        public void run()
        {
                MNDirectUIHelper.setHostActivity(LoaderActivity.m_Activity);
                             MNDirect.init(gameID,puID,new MNEventHandler(DashActivity),LoaderActivity.m_Activity);
                DashActivity = new DashBoardActivity();

        }
    };


а как правильно используя это активити создать Intent?
этот код оставить или что то менять нужно? я сам пишу на си, и поэтому для меня не все тут понятно
Код

    public int ShowAds()
    {
        try
        {

        LoaderActivity.m_Activity.runOnUiThread(new Runnable()
                    {public void run ()    
                    {
                             Intent intent = new Intent(LoaderActivity.m_Activity,com.my.DashBoardActivity.class);
                             intent.setClass(LoaderActivity.m_Activity, DashBoardActivity.class);
                             LoaderActivity.m_Activity.startActivity(intent);    
                            
                    }    }); 
                    return 1;
        }
        catch (Exception e)
        {
            return 0;
        }


то есть если я правильно понимаю сейчас два разных экземпляра DashBoardActivity

Это сообщение отредактировал(а) Burka - 12.10.2011, 12:08


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
ivanovpv
Дата 12.10.2011, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Сначала надо создать объект и только потом передавать его! Иначе какой от него толк в приемнике? В сях все равно та же идеология (до и вообще везде!)

Создание Activity - это фактически его запуск через Intent (у вас написано в showAds()). То есть вам надо сначала запустить Activity и потом передать его в ваш хэндлер. Скорее даже наоборот в onCreate() вашего DashActivity вставить вызов хэндлера и все такое - ну я не знаю же ваш код!

В общем идея простая:
а) Создайте/запустите ваш активити
б) Затем придумайте как его передать в хэндлер (способ я показал)
в) Затем уже из хэндлера при необходимости спокойно убивайте



--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Burka
Дата 12.10.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Да извиняюсь, не туда вставил. С хендлером понятно, не понятно с Intent
Код

     private final Runnable InitSDK = new Runnable()
    {
        @Override
        public void run()
        {
                DashActivity = new DashBoardActivity();
                MNDirectUIHelper.setHostActivity(LoaderActivity.m_Activity);
                MNDirect.init(gameID,puID,new MNEventHandler(DashActivity),LoaderActivity.m_Activity);
        }


Если создавать Intent так, то поидее будет создан второй экземпляр  DashBoardActivity, который никак не относится к DashActivity.
А как создать Intent используя переменную DashBoard я не могу понять.
для меня именно этот момент не понятен, потому что выдрать ссылку на активити не получается никак из созданого Intent. Хотя судя по всему активити создается
Код

                             Intent intent = new Intent(LoaderActivity.m_Activity,com.my.DashBoardActivity.class);
                             intent.setClass(LoaderActivity.m_Activity, DashBoardActivity.class);
                             LoaderActivity.m_Activity.startActivity(intent);    


Это сообщение отредактировал(а) Burka - 12.10.2011, 12:17


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
ivanovpv
Дата 13.10.2011, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Burka, от того что вы вызвали конструктор Activity - ничего не происходит. Активити не создается вызовом конструктора! Конструктор активити ось вызывает сама. Способ создания активити - один через Intent и все. Прочитайте про жизненный цикл активити

Я же вам уже сказал как надо действовать:
1) Создать активити через Intent
2) Далее в методе onCreate() активити у вас будет ссылка на саму активити в виде this
3) Теперь берите этот this и пихайте его в ваш хэндлер

Это сообщение отредактировал(а) ivanovpv - 13.10.2011, 08:04


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Burka
Дата 14.10.2011, 03:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Если не сложно посмотрите что тут не так, сделал все по списку. Получаю ошибку
Цитата

 java.lang.NullPointerException


ошибка сразу при инициализации, в методе InitSDK.
уже не знаю что можно сделать



Код

class PlayPhone
{
    Intent intent;
    DashBoardActivity DashBoardVar;
    String puID = "111111111";
    int gameID =  111;
    View mainView;
    
     private final Runnable InitSDK = new Runnable()
    {
        @Override
        public void run()
        {
                intent = new Intent(LoaderActivity.m_Activity,com.my.DashBoardActivity.class);
                MNDirectUIHelper.setHostActivity(LoaderActivity.m_Activity);
                             MNDirect.init(gameID,puID,new MNEventHandler(DashBoardVar.apoint),LoaderActivity.m_Activity);
        }
    };

 public int ShowAds()
    {
        try
        {

        LoaderActivity.m_Activity.runOnUiThread(new Runnable()
                    {public void run ()    
                    {
                             LoaderActivity.m_Activity.startActivity(intent);
                             DashBoardVar.Show();    
                            
                    }    }); 
                    return 1;
        }
        catch (Exception e)
        {
            return 0;
        }
       
    }



Активити
Код

public class DashBoardActivity extends Activity 
    {
        
        public DashBoardActivity apoint;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);  
            apoint = this;
        }    
        
        @Override
        protected void onDestroy () 
        {
          ViewGroup vg = (ViewGroup)(MNDirect.getView().getParent());
         if (vg != null)
                {
                        vg.removeView(MNDirect.getView());
                }
        super.onDestroy();
        }
        
        public void Show()
        {
            setContentView(MNDirect.getView());
            MNDirect.getView().requestFocus();
            MNDirectButton.show();
        }
        
        public void Close()
        {
            apoint.finish();
        }

    }



--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
ivanovpv
Дата 14.10.2011, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Вообще то я не компилятор  smile 

Тем не менее сразу же видно, что вы пытаетесь использовать член класса до его инициализации... Вы не запустив DashboardActivity пытаетесь достучаться до apoint!

Кто будет делать intent.startActivity()? Дядя Вася или все таки вы своими рученьками?  smile 

Да, и кстати делать это надо раньше - до вызова run() - поскольку startActivity() отработает только после того как управление вернется к оконной системе

Это сообщение отредактировал(а) ivanovpv - 14.10.2011, 08:32


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Burka
Дата 14.10.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата

Кто будет делать intent.startActivity()? Дядя Вася или все таки вы своими рученьками?  smile 

А что делать если мне не нужно активити запускать при инициализации программы? Но инициализацию SDK надо сделать

Это сообщение отредактировал(а) Burka - 14.10.2011, 16:15


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
ivanovpv
Дата 17.10.2011, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



Цитата(Burka @  14.10.2011,  17:15 Найти цитируемый пост)
А что делать если мне не нужно активити запускать при инициализации программы? Но инициализацию SDK надо сделать

Ну так и сказали бы! Передавайте тогда в хэндлер Intent


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
newfin
Дата 25.11.2011, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 25.11.2011
Где: Россия Липецк

Репутация: нет
Всего: нет



У меня тоже такое было. А еще почему не работает GPS на телефоне модель НТС, хотя на WM все работает.
PM MAIL WWW ICQ Skype YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0882 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.