【问题标题】:SectionsStatePagerAdapter deprecated errorSectionsStatePagerAdapter 已弃用错误
【发布时间】:2023-04-05 19:29:01
【问题描述】:

我开发了一个分区状态寻呼机适配器,旨在帮助处理移动应用程序帐户设置中的片段。但是,我似乎无法弄清楚我哪里出错了。

注意事项: 由于 A 已被弃用,这部分代码已从 A 更改为 B。

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)

【问题讨论】:

    标签: java android android-fragments fragmentpageradapter


    【解决方案1】:

    我在回答您的其他问题之一时来到这里,似乎这与同一个应用程序有关。

    您遇到的错误不是因为您在 SectionsStatePagerAdapter 中所做的更改,而是因为您在 layout_center_viewpager 包含在 activity_accountsettings.xml 布局中添加了错误的 ViewPager。

    确保使用 androidx.viewpager.widget.ViewPager 而不是已弃用的 android.support.v4.view.ViewPager ,并将 id 作为容器。

    替换这个并休息应该没问题,因为在你的活动中你正在使用这个import androidx.viewpager.widget.ViewPager;导入正确的一个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-16
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多