I am having problems in my Drawer. I am using fragments.If I try to run the "app keeps stopping" error appears.
In my DrawerItem.java
package com.example.papbiensaude;
import android.view.ViewGroup;
public abstract class DrawerItem<T extends DrawerAdapter.ViewHolder> {
protected boolean isChecked;
public abstract T createViewHolder(ViewGroup parent);
public abstract void bindViewHolder (T holder);
public DrawerItem<T>setChecked(boolean isChecked){
this.isChecked = isChecked;
return this;
}
public boolean isChecked(){
return isChecked();
}
public boolean isSelectable(){
return true;
}
}
In my DrawerAdapter.java
package com.example.papbiensaude;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.ViewHolder> {
private List<DrawerItem> items;
private Map<Class<? extends DrawerItem>, Integer> viewTypes;
private SparseArray<DrawerItem> holderFactories;
private OnItemSelectedListener listener;
public DrawerAdapter( List<DrawerItem> items){
this.items = items ;
this.viewTypes = new HashMap<>();
this.holderFactories = new SparseArray<>();
processViewTypes();
}
private void processViewTypes() {
int type = 0;
for (DrawerItem item : items){
if(!viewTypes.containsKey(item.getClass())){
viewTypes.put(item.getClass(),type);
holderFactories.put(type, item);
type++;
}
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewHolder holder = holderFactories.get(viewType).createViewHolder(parent);
holder.drawerAdapter = this;
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
items.get(position).bindViewHolder(holder);
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public int getItemViewType(int position){
return viewTypes.get(items.get(position).getClass());
}
public void setSelected(int position){
DrawerItem newChecked = items.get(position);
if (!newChecked.isSelectable()){
return;
}
for (int i=0; i<items.size(); i++){
DrawerItem item = items.get(i);
if (item.isChecked()){
item.setChecked(false);
notifyItemChanged(i);
break;
}
}
newChecked.setChecked(true);
notifyItemChanged(position);
if (listener != null){
listener.onItemSelected(position);
}
}
public void setListener(OnItemSelectedListener listener){
this.listener = listener;
}
public interface OnItemSelectedListener{
void onItemSelected(int position);
}
static abstract class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private DrawerAdapter drawerAdapter;
public ViewHolder (@NonNull View itemView){
super(itemView);
itemView.setOnClickListener(this);
}
public void onClick(View v){
drawerAdapter.setSelected(getAdapterPosition());
}
}
}
In my PricipalActivity.java
package com.example.papbiensaude;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.WindowManager;
import com.yarolegovich.slidingrootnav.SlidingRootNav;
import com.yarolegovich.slidingrootnav.SlidingRootNavBuilder;
import java.util.Arrays;
public class PrincipalActivity extends AppCompatActivity implements DrawerAdapter.OnItemSelectedListener{
private static final int POS_CLOSE = 0;
private static final int POS_DASHBOARD = 1;
private static final int POS_MY_PROFILE = 2;
private static final int POS_NEARBY_RES = 3;
private static final int POS_SETTINGS = 4;
private static final int POS_ABOUT_US = 5;
private static final int POS_LOGOUT = 6;
private String[] screenTitles;
private Drawable[] screenIcons;
private SlidingRootNav slidingRootNav;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_principal);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
slidingRootNav = new SlidingRootNavBuilder(this)
.withDragDistance(180)
.withRootViewScale(0.75f)
.withRootViewElevation(25)
.withToolbarMenuToggle(toolbar)
.withContentClickableWhenMenuOpened(false)
.withSavedState(savedInstanceState)
.withMenuLayout(R.layout.drawer_menu)
.inject();
screenIcons = loadScreensIcons();
screenTitles = loadScreensTitles();
DrawerAdapter adapter = new DrawerAdapter(Arrays.asList(
createItemFor(POS_CLOSE),
createItemFor(POS_DASHBOARD),
createItemFor(POS_MY_PROFILE),
createItemFor(POS_NEARBY_RES),
createItemFor(POS_SETTINGS),
createItemFor(POS_ABOUT_US),
new SpaceItem(260),
createItemFor(POS_LOGOUT)
));
adapter.setListener(this);
RecyclerView list = findViewById(R.id.drawer_list);
list.setNestedScrollingEnabled(false);
list.setLayoutManager(new LinearLayoutManager(this));
list.setAdapter(adapter);
adapter.setSelected(POS_DASHBOARD);
}
private DrawerItem createItemFor(int position){
return new SimpleItem(screenIcons[position],screenTitles[position])
.withIconTint(color(R.color.themeColor))
.withTextTint(color(R.color.black))
.withSelectedIconTint(color(R.color.themeColor))
.withSelectedTextTint(color(R.color.themeColor));
}
@ColorInt
private int color (@ColorRes int res){
return ContextCompat.getColor(this,res);
}
private String[] loadScreensTitles() {
return getResources().getStringArray(R.array.id_activityScreenTitles);
}
private Drawable[] loadScreensIcons() {
TypedArray ta = getResources().obtainTypedArray(R.array.id_activityScreenIcons);
Drawable[] icons = new Drawable[ta.length()];
for (int i = 0; i < ta.length(); i++){
int id = ta.getResourceId(i,0);
if (id!=0){
icons[i] = ContextCompat.getDrawable(this,id);
}
}
ta.recycle();
return icons;
}
@Override
public void onItemSelected(int position) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (position == POS_DASHBOARD){
DashBoardFragment dashBoardFragment = new DashBoardFragment();
transaction.replace(R.id.container, dashBoardFragment);
}
else if (position == POS_MY_PROFILE){
MyProfileFragment myProfileFragment = new MyProfileFragment();
transaction.replace(R.id.container, myProfileFragment);
}
else if (position == POS_LOGOUT){
finish();
}
slidingRootNav.closeMenu();
transaction.addToBackStack(null);
transaction.commit();
}
}
MY LOGCAT RUTURN THIS ERRORS:
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.StackOverflowError: stack size 8MB
at com.example.papbiensaude.DrawerItem.isChecked(DrawerItem.java:18)
2021-02-04 14:46:13.910 11640-11640/com.example.papbiensaude E/AndroidRuntime: at com.example.papbiensaude.DrawerItem.isChecked(DrawerItem.java:18)
at com.example.papbiensaude.DrawerItem.isChecked(DrawerItem.java:18)
at com.example.papbiensaude.DrawerAdapter.setSelected(DrawerAdapter.java:73)
at com.example.papbiensaude.PrincipalActivity.onCreate(PrincipalActivity.java:77)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I still don't understand where the error is and how to recover it!
question from:
https://stackoverflow.com/questions/66049420/how-to-resolve-java-lang-stackoverflowerror-stack-size-8mb 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…