Выполнение AsyncTask из PlaceHolderFragment: "На com.example.Activity.this нельзя ссылаться из статического контекста"

Я создал вкладку деятельности под названием UserProfile.java, Как многие из вас знают, этот вид деятельности поставляется со встроенным классом под названием PlaceholderFragment где в основном происходит магия. Шахта выглядит следующим образом:

public static class PlaceholderFragment extends Fragment {

    private static final String ARG_SECTION_NUMBER = "section_number";


    public PlaceholderFragment() {
    }

    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

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

        // Some code related to database queries irrelevant to this question...

        if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) {
            View profileView = inflater.inflate(
                    R.layout.fragment_user_profile_data,
                    container,
                    false
            );

            // Here's some code intended to get edittext's values irrelevant to this question...

            final Button saveProfile = (Button) profileView.findViewById(R.id.profile_save_data);

            saveProfile.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    UpdateProfileForm upf = new UpdateProfileForm(
                            userName.getText().toString(),
                            userLastName.getText().toString(),
                            userID.getText().toString(),
                            userPhone.getText().toString(),
                            userEmail.getText().toString(),
                            userAddress.getText().toString()
                    ); 

                    new UpdateProfile().execute(upf);
                    view.setVisibility(View.GONE);
                }
            });
            return profileView;


        } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) {
            View profileView = inflater.inflate(R.layout.another_fragment, container, false);
            return profileView;
        } else {
            View profileView = inflater.inflate(R.layout.fragment_user_profile_data, container, false);
            return profileView;
        }
    }
}

Как видите, у меня есть фрагмент формы под названием fragment_user_profile_data где я получаю данные пользователя, UpdateProfileForm класс для хранения и передачи в AsyncTask с именем UpdateProfile используется для обновления информации о пользователе на стороне сервера при нажатии saveProfile кнопка.

Однако, если попробовать эту строку

new UpdateProfile().execute(upf);

На com.example.UserProfile.this нельзя ссылаться из статического контекста.

ошибка будет показана Android Studio. Мне сказали либо убрать "статическое" свойство из класса PlaceholderFragment, либо сделать мой AsyncTask статическим, но ни один из них не работает.

Я застрял в этом, поэтому любая помощь будет оценена!

3 ответа

Решение

Итак, в основном то, что я делал, было неправильно, так как я использовал один фрагмент (PlaceholderFragment) для трех отдельных обязанностей, как @cricket_007 упомянул в своем комментарии к моему вопросу.

Я сделал это, потому что единственный учебник TabbedActivity, который я нашел, использует его.

По сути, при работе с TabbedActivity вам не нужен PlaceholderFragment, чтобы вы могли легко избавиться от него. Теперь в getItem метод SectionsPagerAdapter класс, созданный в рамках действия, замените следующую строку

return PlaceholderFragment.newInstance(position + 1);

с помощью оператора switch для аргумента позиции и возврата экземпляра соответствующего фрагмента. то есть:

public Fragment getItem(int position) {
    switch (position) {
        case 0:
            UserProfileData tab1 = new UserProfileData();
            return tab1;
        case 1:
            UserProfileCollections tab2 = new UserProfileCollections();
            return tab2;
        case 2:
            UserProfileBalance tab3 = new UserProfileBalance();
            return tab3;
        default:
            return null;
    }
}

Наконец, объявите AsyncTask и класс формы в классе Fragment и установите значения EditTexts и функциональность кнопки в пределах фрагмента. onCreateView метод, затем надуйте его и верните.

Я надеюсь, что этот ответ поможет, учитывая отсутствие образцов об этой деятельности. Спасибо за ваши ответы в любом случае!

Удалить статическое ключевое слово из фрагмента.

public static class PlaceholderFragment extends Fragment 

и переместите UpdateProfile AsyncTask в отдельный класс. Теперь это похоже на внутренний класс другого фрагмента.

Ты не можешь позвонить MyActivity.this от статического метода. Вот обходной путь.

Объявите переменную в вашем Activity/Fragment как это:

private static Activity activity;

Тогда в вашем onCreate():

activity = this;
// OR
activity = getActivity(); // if you are in fragment

А потом, в вашем UpdateProfile() Метод AsyncTask, вызовите его так:

activity.someMethod();
Другие вопросы по тегам