【问题标题】:Moving between fragments using BottomNavigationView使用 BottomNavigationView 在片段之间移动
【发布时间】:2018-10-01 09:29:01
【问题描述】:

我正在尝试使用 BottomNavigationView 在 3 个片段之间移动,我成功了,但我遇到了一个小问题。

我有 2 个片段和 1 个活动,这个活动中有代码在其中的片段之间移动。

当我按下底部导航栏上的按钮时,我可以看到底部导航栏的图像发生变化。

在一个片段中,我制作了一个按钮,按下时会移动到另一个片段,效果很好。

我面临的问题是当我按下按钮移动到另一个片段时,底栏图像没有改变。

这是我的主要活动代码:

public class MainActivity extends AppCompatActivity {


    public static Bundle bundle = new Bundle();


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

        BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
        bottomNav.setOnNavigationItemSelectedListener(navListener);

        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment()).commit();
        }

    private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Fragment selectedFragment = null;

                switch (item.getItemId()) {
                    case R.id.nav_home:
                        selectedFragment = new HomeFragment();
                        break;
                    case R.id.nav_announcement:
                        selectedFragment = new AnnouncementFragment();
                        break;
                }

                 getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        selectedFragment).commit();

                return true;
            }
        };
}

这是带有按钮的片段的代码:

public class HomeFragment extends Fragment {

    Calendar calendar = Calendar.getInstance();
    Button buttonTrack;
    int year, month, day;

    public HomeFragment() {
        //Required empty public constructor
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                         Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_home, container, false);

        this.year = calendar.get(Calendar.YEAR);
        this.month = calendar.get(Calendar.MONTH) + 1;
        this.day = calendar.get(Calendar.DAY_OF_MONTH);

        buttonTrack = view.findViewById(R.id.btn_track);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.getDefault());
        final String currentTime = simpleDateFormat.format(new Date());


        buttonTrack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                MainActivity.bundle.putString("time", currentTime);

                getFragmentManager().beginTransaction().replace(R.id.fragment_container, new AnnouncementFragment()).commit();

            }
        });

        return view;

    }
}

还有另一个片段:

public class AnnouncementFragment extends Fragment {

    String timeFromBundle;
    TextView announcementHere, timeView;


    public AnnouncementFragment() {
    // Required empty public constructor
        }

    @SuppressLint("NewApi")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_announcement, container, false);

        timeFromBundle = MainActivity.bundle.getString("time");

        announcementHere = view.findViewById(R.id.announcement_here);
        timeView = view.findViewById(R.id.time_view);
        timeView.setText(timeFromBundle);

        return view;
    }

}

任何人都可以告诉我什么时候应该修复以使其更改底部栏中的图像,即使我通过按下片段内的按钮移动到另一个片段?提前致谢!

【问题讨论】:

  • 在你的bottomNavigationView中使用viewpager

标签: android android-layout android-fragments bottomnavigationview


【解决方案1】:

在您的按钮单击侦听器内的HomeFragment 中,而不是这一行

getFragmentManager().beginTransaction().replace(R.id.fragment_container, new AnnouncementFragment()).commit();

使用这个

((BottomNavigationView)getActivity().findViewById(R.id.bottom_navigation)).setSelectedItemId(R.id.nav_announcement);

它会在你的活动中调用你的BottomNavigationView.OnNavigationItemSelectedListener

【讨论】:

  • BottomNavigationView 没有setSelectedItem,但有setSelectedItemId
  • 抱歉,打错字了
  • 必须在调用 setSelectedItemId 之前已经添加了所有项目并设置了监听器。如果在添加菜单项和设置侦听器之前调用 setSelectedItemId,则不会发生任何事情。
  • 工作!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2022-08-18
相关资源
最近更新 更多