I have developed a section state pager adapter that is meant to help with the fragments in the account settings of the mobile application. However I can't seem to figure out where I've gone wrong.
Things to keep in mind: This section of the code was changed from A to B since A was deprecated.
A.
public SectionsStatePagerAdapter(FragmentManager fm) {
super(fm);
}
B.
public SectionsStatePagerAdapter(FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
The above piece of code affects this bit in AccountSettingsActivity:
pagerAdapter = new SectionsStatePagerAdapter(getSupportFragmentManager());
Here is all my code:
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);
}
});
}
}
**When the menu icon is clicked to display the options, instead of showing the options the screen goes white and returns back to the previous page, once clicked again the app crashes.
Here is the error:
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)
came here while I was answering one of your other questions and seems this was related to the same application.
The error you are getting is NOT because of the change you made in
SectionsStatePagerAdapterit is because you are adding the wrong ViewPager in yourlayout_center_viewpagerincluded inactivity_accountsettings.xmllayout.Make sure you use
androidx.viewpager.widget.ViewPagerinstead of the deprecatedandroid.support.v4.view.ViewPager, with id as container.Replace this and rest should be fine as in your activity you are importing the correct one using this
import androidx.viewpager.widget.ViewPager;