【问题标题】:fragment wont transaction when click on the button which change the fragment to another当单击将片段更改为另一个的按钮时,片段不会交易
【发布时间】:2018-02-22 12:41:29
【问题描述】:

我有 2 个带有底部导航视图的片段 当我单击项目来更改片段时,什么也没有发生,它仍然显示默认片段

这里是代码

MainActivity.class

public class MainActivity extends AppCompatActivity {

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

        BottomNavigationView bottomNavigationView =(BottomNavigationView)findViewById(R.id.navigation);
        bottomNavigationView.setSelectedItemId(R.id.home);
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()){

                    case R.id.community:
                        //onClick on Community Button
                        Alert();
                        break;
                    case R.id.home:
                        //OnClick on Home Button
                       goHome();

                        break;

                    case R.id.setting:
                        //OnClick on Setting Button
                       goSetting();
                        break;
                }
                return true;

            }
        });
    }
    //THIS Methods to Transaction between Fragments
    private void  goHome(){
        HomeF home = new HomeF();
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.fragmentlayout,home);
    }
    private void goSetting(){
        SettingF setting = new SettingF();
        FragmentManager fa = getFragmentManager();
        FragmentTransaction fs = fa.beginTransaction();
        fs.replace(R.id.fragmentlayout,setting);
    }
    private void Alert(){
        AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
        alert.setTitle("Attention");
        alert.setMessage("This section is Under Development stay tuned for the Biggest Openning");
        alert.show();

        Toast.makeText(MainActivity.this,"Community",Toast.LENGTH_LONG).show();

    }

}

这里是默认视图的片段类

HomeFragment.class

 public class HomeF extends Fragment {

    private  RecyclerView rc;
    private Context mContext;
    private List<listitems> list = new ArrayList<>();
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState){
            // Inflate the layout for this fragment
           final View view = inflater.inflate(R.layout.fragment_home, container, false);

        rc = view.findViewById(R.id.recycler);
        rc.setLayoutManager(new GridLayoutManager(this.getActivity(),2));
        rc.setHasFixedSize(true);

        list.add(new listitems(
                1
                ,"Mobile"
                ,R.drawable.phone
        ));

        list.add(new listitems(
                1
                ,"Laptop"
                ,R.drawable.laptop
        ));

        list.add(new listitems(
                1
                ,"CAR"
                ,R.drawable.car
        ));

        list.add(new listitems(
                1
                ," TV"
                ,R.drawable.tv
        ));
        list.add(new listitems(
                1
                ,"House"
                ,R.drawable.house
        ));

        itemsAdapter adapter = new itemsAdapter(this.getActivity(),list);
        rc.setAdapter(adapter);
        rc.setItemAnimator(new DefaultItemAnimator());
        return view;

    }
}

适配器类

 public class itemsAdapter extends RecyclerView.Adapter<itemsAdapter.ViewHolder>  {

    private Context mContex;
    private List<listitems> myList ;

    public itemsAdapter(Context mContex, List<listitems> myList) {
        this.mContex = mContex;
        this.myList = myList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_row,parent,false);
        ViewHolder holder = new ViewHolder(row);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

       final listitems listy = myList.get(position);

       holder.txt.setText(listy.getTitle());
        Glide.with(mContex).asBitmap().thumbnail(0.5f)
                .load(listy.getImage())
                .into(holder.img);
    }

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


    public class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView img;
        public TextView txt;

        public ViewHolder(View itemView) {
            super(itemView);

            img =itemView.findViewById(R.id.imgLogo);
            txt = itemView.findViewById(R.id.txtTitle);

        }
    }

}

感谢您的宝贵时间。

【问题讨论】:

标签: java android android-studio bottomnavigationview


【解决方案1】:

替换片段后提交FragmentTransaction。添加

ft.commit();

在这两种方法中

HomeF home = new HomeF();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragmentlayout,home);
ft.commit();

【讨论】:

  • 还是什么都没有??
【解决方案2】:

您需要在最后提交事务。 对于这两种方法

private void  goHome(){
    HomeF home = new HomeF();
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragmentlayout,home);
    ft.commit();
}
private void goSetting(){
    SettingF setting = new SettingF();
    FragmentManager fa = getFragmentManager();
    FragmentTransaction fs = fa.beginTransaction();
    fs.replace(R.id.fragmentlayout,setting);
    ft.commit();
}

或者可能你应该使用通用方法

private void replaceFragment(Fragment f){
        FragmentManager fa = getFragmentManager();
        FragmentTransaction fs = fa.beginTransaction();
        fs.replace(R.id.fragmentlayout,f);
        ft.commit();
    }

并在方法中传递Fragment,而不是为每个片段事务制作不同的方法。

【讨论】:

  • 我把 commit() 还是一无所获??
  • 能否在 goHome() 和 goSetting() 上记录事件并检查这些方法是否正在执行。
【解决方案3】:

尝试使用 SupportFragmentManager 代替 FragmentManager

 SettingF setting = new SettingF();
 getSupportFragmentManager().beginTransaction()
                                .add(R.id.fragmentlayout, setting, "setting")
                                .commit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多