SectionsStatePagerAdapter устарела ошибка - PullRequest
0 голосов
/ 04 февраля 2020

Я разработал адаптер пейджера состояния раздела, который предназначен для помощи с фрагментами в настройках учетной записи мобильного приложения. Однако я не могу понять, где я ошибся.

Что следует иметь в виду: этот раздел кода был изменен с A на B, поскольку A устарела.

A.

public SectionsStatePagerAdapter(FragmentManager fm) {
    super(fm);
}

B.

public SectionsStatePagerAdapter(FragmentManager fm) {
    super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}

Этот фрагмент кода влияет на этот бит в AccountSettingsActivity:

pagerAdapter = new SectionsStatePagerAdapter(getSupportFragmentManager());

Вот весь мой код:

SectionsStatePagerAdapter. java

package com.archive.pod.Utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;

/** This activity allows for the movement between account settings options */

public class SectionsStatePagerAdapter extends FragmentStatePagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final HashMap<Fragment, Integer> mFragments = new HashMap<>();
    private final HashMap<String, Integer> mFragmentNumbers = new HashMap<>();
    private final HashMap<Integer, String> mFragmentNames = new HashMap<>();

    public SectionsStatePagerAdapter(FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String fragmentName){
        mFragmentList.add(fragment);
        mFragments.put(fragment, mFragmentList.size()-1);
        mFragmentNumbers.put(fragmentName, mFragmentList.size()-1);
        mFragmentNames.put(mFragmentList.size()-1, fragmentName);
    }

    /**
     * returns the fragment with the name @param
     * @param fragmentName
     * @return
     */

    public Integer getFragmentNumber(String fragmentName){
        if(mFragmentNumbers.containsKey(fragmentName)){
            return mFragmentNumbers.get(fragmentName);
        }else{
            return null;
        }
    }

    /**
     * returns the fragment with the name @param
     * @param fragment
     * @return
     */

    public Integer getFragmentNumber(Fragment fragment){
        if(mFragmentNumbers.containsKey(fragment)){
            return mFragmentNumbers.get(fragment);
        }else{
            return null;
        }
    }

    /**
     * returns the fragment with the name @param
     * @param fragmentNumber
     * @return
     */

    public String getFragmentName(Integer fragmentNumber){
        if(mFragmentNames.containsKey(fragmentNumber)){
            return mFragmentNames.get(fragmentNumber);
        }else{
            return null;
        }
    }
}

AccountSettingsActivity. java

package com.archive.pod.Profile;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.RelativeLayout;

import com.archive.pod.R;
import com.archive.pod.Utils.SectionsStatePagerAdapter;

import java.util.ArrayList;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

public class AccountSettingsActivity extends AppCompatActivity {

    //Initializing
    private Context mContext;
    private SectionsStatePagerAdapter pagerAdapter;
    private ViewPager mViewPager;
    private RelativeLayout mRelativeLayout;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_accountsettings);

        mContext = AccountSettingsActivity.this;
        mViewPager = findViewById(R.id.container);
        mRelativeLayout = findViewById(R.id.relLayout1);

        //Account Settings Options List Initializer
        setupSettingsList();

        //Account Settings Options Fragment Initializer
        setupFragments();

        //Back Arrow Initialization for Navigation Back to "Profile Activity"
        ImageButton backArrow = findViewById(R.id.back_arrow);
        backArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }


    private void setupFragments(){
        pagerAdapter = new SectionsStatePagerAdapter(getSupportFragmentManager());
        pagerAdapter.addFragment(new EditProfileFragment(), getString(R.string.editProfile)); //fragment 0
        pagerAdapter.addFragment(new LogoutFragment(), getString(R.string.logout)); // fragment 1
    }

    //Allows for the overlay to show fragment on top of account settings activity
    private void setViewPager(int fragmentNumber){
        mRelativeLayout.setVisibility(View.GONE);
        mViewPager.setAdapter(pagerAdapter);
        mViewPager.setCurrentItem(fragmentNumber);
    }


    //All Options in Account Settings
    private  void setupSettingsList(){
        ListView listView = findViewById(R.id.lvAccountSettings);

        ArrayList<String> options = new ArrayList<>();
        options.add(getString((R.string.editProfile))); //fragment 0
        options.add(getString(R.string.notifications)); //fragment 1
        options.add(getString(R.string.privacy_settings)); //fragment 2
        options.add(getString(R.string.security)); //fragment 3
        options.add(getString(R.string.ads)); //fragment 4
        options.add(getString(R.string.help)); //fragment 5
        options.add(getString(R.string.about)); //fragment 6
        options.add(getString(R.string.logout)); //fragment 7

        ArrayAdapter adapter = new ArrayAdapter(mContext, R.layout.listview_row_adjustment, options);
        listView.setAdapter((adapter));

        //Navigation to fragment page
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                setViewPager(position);
            }
        });
    }
}

** При нажатии значка меню для отображения параметров вместо отображения параметров экран становится белым и возвращается на предыдущую страницу, после повторного нажатия на приложение. аварий.

Вот ошибка:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.archive.pod, PID: 19936
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.archive.pod/com.archive.pod.Profile.AccountSettingsActivity}: android.view.InflateException: Binary XML file line #8 in com.archive.pod:layout/activity_accountsettings: Binary XML file line #7 in com.archive.pod:layout/layout_center_viewpager: Error inflating class android.support.v4.view.ViewPager
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: android.view.InflateException: Binary XML file line #8 in com.archive.pod:layout/activity_accountsettings: Binary XML file line #7 in com.archive.pod:layout/layout_center_viewpager: Error inflating class android.support.v4.view.ViewPager
     Caused by: android.view.InflateException: Binary XML file line #7 in com.archive.pod:layout/layout_center_viewpager: Error inflating class android.support.v4.view.ViewPager
     Caused by: java.lang.ClassNotFoundException: android.support.v4.view.ViewPager
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:454)
        at android.view.LayoutInflater.createView(LayoutInflater.java:815)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1231)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1119)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:682)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:534)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:481)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
        at com.archive.pod.Profile.AccountSettingsActivity.onCreate(AccountSettingsActivity.java:33)
        at android.app.Activity.performCreate(Activity.java:7825)
        at android.app.Activity.performCreate(Activity.java:7814)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.view.ViewPager" on path: DexPathList[[zip file "/data/app/com.archive.pod-mXwsGv9uKssJ6m5RH4nB6w==/base.apk"],nativeLibraryDirectories=[/data/app/com.archive.pod-mXwsGv9uKssJ6m5RH4nB6w==/lib/arm64, /system/lib64, /system/product/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)

1 Ответ

0 голосов
/ 12 февраля 2020

пришел сюда, когда я отвечал на один из ваших других вопросов, и кажется, что это было связано с тем же приложением.

Ошибка, которую вы получаете, НЕ из-за изменений, которые вы сделали в SectionsStatePagerAdapter, это потому, что вы добавляете неправильный ViewPager в layout_center_viewpager, включенном в макет activity_accountsettings.xml.

Убедитесь, что вы используете androidx.viewpager.widget.ViewPager вместо устаревшего android.support.v4.view.ViewPager с идентификатором в качестве контейнера.

Замените это, и остальное должно быть в порядке, так как в вашей деятельности вы импортируете правильную, используя эту import androidx.viewpager.widget.ViewPager;

...