Java 安卓碎片——”;“活动已被销毁”;在片段中按文本后

Java 安卓碎片——”;“活动已被销毁”;在片段中按文本后,java,android,android-fragments,Java,Android,Android Fragments,因此,我一直在尝试在我的应用程序中实现一个功能,当我从searchBoxResultsFragment中单击一个用户名时,该用户名是显示搜索框用户结果的一个片段,它将转到用户的配置文件 用户的配置文件将被放置在名为UserFragment的新片段中。因此,基本上,searchBoxResultsFragment将被UserFragment替换。因此,我在调用函数中使用了ft.replace(),为UserFragment创建了一个新实例,它位于MainNavigation活动类的UserFrag

因此,我一直在尝试在我的应用程序中实现一个功能,当我从
searchBoxResultsFragment
中单击一个用户名时,该用户名是显示搜索框用户结果的一个片段,它将转到用户的配置文件

用户的配置文件将被放置在名为
UserFragment
的新片段中。因此,基本上,
searchBoxResultsFragment
将被
UserFragment
替换。因此,我在调用函数中使用了
ft.replace()
,为
UserFragment
创建了一个新实例,它位于
MainNavigation
活动类的
UserFragment()
函数中

但是,我运行时遇到一个错误
活动已被破坏
,导致我的应用程序崩溃

我是Android开发新手,正在自学如何开发应用程序

以下是我的代码:

MainNavigation.java

public class MainNavigation extends AppCompatActivity {

    private BottomNavigationView mBottomNav;

    // fix main layout of navigation
    ImageButton uProfileBtn, searchBox;

    GetSearchBoxResults getSearcResults;

    EditText searchBoxText;

    Fragment frag = null;


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

        // hide action bar
        if(this.getSupportActionBar()!=null) {
            this.getSupportActionBar().hide();
        }

        uProfileBtn = (ImageButton) findViewById(R.id.profileBtn);
        searchBox = (ImageButton) findViewById(R.id.searchFriendBtn);

        mBottomNav = (BottomNavigationView) findViewById(R.id.navigation);
        mBottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                selectFragment(item);
                return true;
            }
        });

        uProfileBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // goes to the Profile Fragment
                profileFragment();
            }
        });

        searchBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // goes to the Search Box Fragment
                searchBoxResultsFragment();
            }
        });
    }

    private void profileFragment() {
        frag = ProfileFragment.newInstance("test1", "test2");
        if (frag != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.add(R.id.fragmentContainer, frag, frag.getTag());
            ft.commit();
        }
    }

    private void searchBoxResultsFragment() {
        frag = SearchBoxFragment.newInstance("test1", "test2");
        if (frag != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.add(R.id.fragmentContainer, frag, frag.getTag());
            ft.commit();
        }
    }

    // so it can be called from the adapter
    public void userFragment() {
        frag = UserFragment.newInstance("test1", "test2");
        if (frag != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.fragmentContainer, frag, frag.getTag());
            ft.commit();
        }
    }

    private void selectFragment(MenuItem item) {
        // init corresponding fragment
        switch (item.getItemId()) {
            case R.id.nav_home_btn:
                frag = HomeFragment.newInstance("test1", "test2");
                break;
            case R.id.nav_message_btn:
                frag = MessagesFragment.newInstance("test1", "test2");
                break;
            case R.id.nav_notif_btn:
                frag = NotificationsFragment.newInstance("test1", "test2");
                break;
            case R.id.nav_settings_btn:
                frag = SettingsFragment.newInstance("test1", "test2");
                break;
        }

        // uncheck the other items
        for (int i = 0; i< mBottomNav.getMenu().size(); i++) {
            MenuItem menuItem = mBottomNav.getMenu().getItem(i);
            menuItem.setChecked(menuItem.getItemId() == item.getItemId());
        }

        // sets the fragment to show
        if (frag != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.add(R.id.fragmentContainer, frag, frag.getTag());
            ft.commit();
        }
    }
}

我将非常感谢任何帮助

您所做的错误是,您正在以编程方式在此行创建活动的新实例

mainNavHelper = new MainNavigation();
要解决此问题,您可以将
MainNavigation
实例传递到适配器并使用它

public class SearchResultsAdapter extends  RecyclerView.Adapter<SearchResultsAdapter.CustomViewHolder>{
    private List<User> users;

    Context context;

    public class CustomViewHolder extends RecyclerView.ViewHolder {
        public TextView userFN, userUN;

        public CustomViewHolder(View view) {
            super(view);
            userFN = (TextView) view.findViewById(R.id.userFullName);
            userUN = (TextView) view.findViewById(R.id.userUsername);

            // when userUN is clicked, then go to their profile
            userUN.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    userUN.setText("this text was clicked");
                    if (context instanceOf MainNavigation) {
                        ((MainNavigation) context).userFragment();
                    }
                }
            });
        }
    }

    public SearchResultsAdapter(Context context, List<User> users){
        this.context = context;        
        this.users = users;
    }

    @Override
    public SearchResultsAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.users_list, parent, false);

        return new SearchResultsAdapter.CustomViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(SearchResultsAdapter.CustomViewHolder holder, int position) {
        User user = users.get(position);
        String uFN = user.getFirstName() + " " + user.getLastName();
        holder.userFN.setText(uFN);
        holder.userUN.setText(user.getUsername());
    }

    @Override
    public int getItemCount() {
        return users.size();
    }
}
公共类SearchResultAdapter扩展了RecyclerView.Adapter{
私人名单用户;
语境;
公共类CustomViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图userFN,userUN;
公共CustomViewHolder(视图){
超级(视图);
userFN=(TextView)view.findViewById(R.id.userFullName);
userUN=(TextView)view.findViewById(R.id.userUserUserName);
//单击userUN后,转到其配置文件
userUN.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
userUN.setText(“单击了此文本”);
if(主导航的上下文实例){
((主导航)context.userFragment();
}
}
});
}
}
公共SearchResultsAdapter(上下文、列表用户){
this.context=上下文;
this.users=用户;
}
@凌驾
public SearchResultsAdapter.CustomViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.users\u列表,父项,false);
返回新的SearchResultsAdapter.CustomViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(SearchResultsAdapter.CustomViewHolder,int位置){
User=users.get(位置);
字符串uFN=user.getFirstName()+“”+user.getLastName();
holder.userFN.setText(uFN);
holder.userUN.setText(user.getUsername());
}
@凌驾
public int getItemCount(){
返回users.size();
}
}

您所做的错误在于,您正在此行以编程方式创建活动的新实例

mainNavHelper = new MainNavigation();
要解决此问题,您可以将
MainNavigation
实例传递到适配器并使用它

public class SearchResultsAdapter extends  RecyclerView.Adapter<SearchResultsAdapter.CustomViewHolder>{
    private List<User> users;

    Context context;

    public class CustomViewHolder extends RecyclerView.ViewHolder {
        public TextView userFN, userUN;

        public CustomViewHolder(View view) {
            super(view);
            userFN = (TextView) view.findViewById(R.id.userFullName);
            userUN = (TextView) view.findViewById(R.id.userUsername);

            // when userUN is clicked, then go to their profile
            userUN.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    userUN.setText("this text was clicked");
                    if (context instanceOf MainNavigation) {
                        ((MainNavigation) context).userFragment();
                    }
                }
            });
        }
    }

    public SearchResultsAdapter(Context context, List<User> users){
        this.context = context;        
        this.users = users;
    }

    @Override
    public SearchResultsAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.users_list, parent, false);

        return new SearchResultsAdapter.CustomViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(SearchResultsAdapter.CustomViewHolder holder, int position) {
        User user = users.get(position);
        String uFN = user.getFirstName() + " " + user.getLastName();
        holder.userFN.setText(uFN);
        holder.userUN.setText(user.getUsername());
    }

    @Override
    public int getItemCount() {
        return users.size();
    }
}
公共类SearchResultAdapter扩展了RecyclerView.Adapter{
私人名单用户;
语境;
公共类CustomViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图userFN,userUN;
公共CustomViewHolder(视图){
超级(视图);
userFN=(TextView)view.findViewById(R.id.userFullName);
userUN=(TextView)view.findViewById(R.id.userUserUserName);
//单击userUN后,转到其配置文件
userUN.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
userUN.setText(“单击了此文本”);
if(主导航的上下文实例){
((主导航)context.userFragment();
}
}
});
}
}
公共SearchResultsAdapter(上下文、列表用户){
this.context=上下文;
this.users=用户;
}
@凌驾
public SearchResultsAdapter.CustomViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.users\u列表,父项,false);
返回新的SearchResultsAdapter.CustomViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(SearchResultsAdapter.CustomViewHolder,int位置){
User=users.get(位置);
字符串uFN=user.getFirstName()+“”+user.getLastName();
holder.userFN.setText(uFN);
holder.userUN.setText(user.getUsername());
}
@凌驾
public int getItemCount(){
返回users.size();
}
}
mainNavHelper = new MainNavigation();
public class SearchResultsAdapter extends  RecyclerView.Adapter<SearchResultsAdapter.CustomViewHolder>{
    private List<User> users;

    Context context;

    public class CustomViewHolder extends RecyclerView.ViewHolder {
        public TextView userFN, userUN;

        public CustomViewHolder(View view) {
            super(view);
            userFN = (TextView) view.findViewById(R.id.userFullName);
            userUN = (TextView) view.findViewById(R.id.userUsername);

            // when userUN is clicked, then go to their profile
            userUN.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    userUN.setText("this text was clicked");
                    if (context instanceOf MainNavigation) {
                        ((MainNavigation) context).userFragment();
                    }
                }
            });
        }
    }

    public SearchResultsAdapter(Context context, List<User> users){
        this.context = context;        
        this.users = users;
    }

    @Override
    public SearchResultsAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.users_list, parent, false);

        return new SearchResultsAdapter.CustomViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(SearchResultsAdapter.CustomViewHolder holder, int position) {
        User user = users.get(position);
        String uFN = user.getFirstName() + " " + user.getLastName();
        holder.userFN.setText(uFN);
        holder.userUN.setText(user.getUsername());
    }

    @Override
    public int getItemCount() {
        return users.size();
    }
}