onAttach(Activity) Deprecated

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Закрыто
j-test
Сообщения: 11
Зарегистрирован: 29 окт 2015, 20:52

onAttach(Activity) Deprecated

Сообщение j-test » 19 ноя 2015, 23:06

Как реализовать передачу сообщений в активити после того как onAttach(Actitivity) стал Deprecated (достали разрабы...) ?
//этот вопрос уже задал в теме урока 106, но там как-то давно никого не было, поэтому думаю может тут быстрее ответят....

пробовал вот так-

Код: Выделить всё

public interface onMainMenuListener
    {
        public void onButtonClickEvent(int i);
    }

    onMainMenuListener mainMenuListener;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try {

            Activity activity;
            if (context instanceof Activity){
                activity=(Activity) context;

            mainMenuListener = (onMainMenuListener) activity;

            }

        }
        catch (ClassCastException e)
        {
            throw new ClassCastException(context.toString()+" must implement onMainMenuListener");
        }
    }
в итоге на попытке передать значение приложение вылетает

Код: Выделить всё

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v=inflater.inflate(R.layout.mainmenu_fragment,container,false);
        Button trainButton = (Button) v.findViewById(R.id.button_train);
        trainButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                [color=#BF0000]mainMenuListener.onButtonClickEvent(1);[/color]
            }
        });


        Button youtubeButton = (Button) v.findViewById(R.id.button_youtube);
        youtubeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                [color=#BF0000]mainMenuListener.onButtonClickEvent(2);[/color]
            }
        });


        return v;
    }
FATAL EXCEPTION: main

java.lang.NullPointerException
at company.ais.simplearithmetic.fragment.MainMenuFragment$1.onClick(MainMenuFragment.java:58)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
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)

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: onAttach(Activity) Deprecated

Сообщение klblk » 20 ноя 2015, 09:15

Если используете фрагменты из support library то метод "onAttach(Context context)" должен нормально работать, иначе этот метот будет работат только на Android 6.0+, в данном случае либо используйте старый метод либо разруливайте логику для разных версий Android.
ну и в try будет достаточно строчки:
[syntax=java]mainMenuListener = (onMainMenuListener) context;[/syntax]

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: onAttach(Activity) Deprecated

Сообщение Mikhail_dev » 20 ноя 2015, 11:28

if (context instanceof Activity){
activity=(Activity) context;
Данное условие не выполняется, поэтому и NullpointerException. Ведь может быт ьи не Activity, а например AppCompatActivity, или FragmentActivity, или еще чего там. Решение вам написали постом выше. Просто замените код

j-test
Сообщения: 11
Зарегистрирован: 29 окт 2015, 20:52

Re: onAttach(Activity) Deprecated

Сообщение j-test » 20 ноя 2015, 12:05

Спасибо за ответы! включил support.v4 и все заработало! (пришлось еще getSupportFragmentManager() вместо getFragmentManager() использовать)

Закрыто