gpt4 book ai didi

java - 如何协调抽屉式导航与底部导航 View

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:45 24 4
gpt4 key购买 nike

我对 Android 开发还很陌生。我正在检查 Material 设计库,并实现了一个带有底部导航的抽屉导航,可以轻松地浏览 fragment 。这两个组件都工作得很好,但我不知道如何协调这两个组件的导航。例如,当在抽屉导航上切换 fragment 时,它会更改布局,但按钮导航所选项目不会随之更改。

如何解决此问题并将两个组件链接起来以相互协作并同步更改的所选项目?

selected Item in bottom navigation drawer: notification

selected Item in navigation drawer: annonce

这就是我的 java 文件的样子,这是 GitHub 上整个项目的链接:https://github.com/mreek/NavigationDrawer

提前谢谢您。

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

private DrawerLayout drawer;
private TextView appBarTV;
private static final String TAG = "MyActivity";

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

Intent intent= new Intent(this,IntroActivity.class);
startActivity(intent);

drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
appBarTV = findViewById(R.id.appbar_text_view);

ImageButton menuRight = findViewById(R.id.leftRight);
menuRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
drawer.openDrawer(GravityCompat.START);
}
}
});

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);

BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.navigation);

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.action_item1:
selectedFragment = MainFragment.newInstance();
break;
case R.id.action_item2:
selectedFragment = AccountFragment.newInstance();
break;
case R.id.action_item3:
selectedFragment = SellFragment.newInstance();
break;
case R.id.action_item4:
selectedFragment = ChatFragment.newInstance();
break;
case R.id.action_item5:
selectedFragment = NotificationFragment.newInstance();
break;
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.f_container, selectedFragment);
transaction.commit();
return true;
}
});

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.f_container, MainFragment.newInstance());
transaction.commit();
}

@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

@Override
public boolean onNavigationItemSelected(MenuItem item) {
drawer.closeDrawers();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

int id = item.getItemId();

if (id == R.id.nav_camera) {
MainFragment fragment = new MainFragment();
ft.replace(R.id.f_container, fragment);
ft.commit();
} else if (id == R.id.nav_gallery) {
//appBarTV.setText("Fragment With Tabs");
ChatFragment fragment = new ChatFragment();
ft.replace(R.id.f_container, fragment);
ft.commit();
} else if (id == R.id.nav_slideshow) {
AccountFragment fragmentTab = new AccountFragment();
ft.replace(R.id.f_container, fragmentTab);
ft.commit();
} else if (id == R.id.nav_share) {
Toast.makeText(this, "Partager", Toast.LENGTH_SHORT).show();
} else if (id == R.id.nav_send) {
Toast.makeText(this, "Rate 5 stars", Toast.LENGTH_SHORT).show();
}

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<include layout="@layout/app_bar_main" />

<FrameLayout
android:id="@+id/f_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="3dp"
android:background="@color/white"
app:itemIconTint="@color/blue"
app:itemTextColor="@color/blue"
app:menu="@menu/bottom_navigation_items" />

</RelativeLayout>

<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer"
app:itemTextColor="@color/black"/>
</android.support.v4.widget.DrawerLayout>

最佳答案

首先,当用户从底部导航中选择选项卡时,您应该避免重新创建 fragment 。您应该将 fragment 保留为私有(private)变量:

private DrawerLayout drawer;
private BottomNavigationView bottomNavigationView;
private MainFragment mainFragment = MainFragment.newInstance();
private AccountFragment accountFragment = AccountFragment.newInstance();
private SellFragment sellFragment = SellFragment.newInstance();
private ChatFragment chatFragment = ChatFragment.newInstance();
private NotificationFragment notificationFragment = NotificationFragment.newInstance();

当用户选择一个选项卡时,只需切换到该 fragment :

bottomNavigationView.setOnNavigationItemSelectedListener(item -> {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.action_announces:
selectedFragment = mainFragment;
break;
case R.id.action_account:
selectedFragment = accountFragment;
break;
case R.id.action_sell:
selectedFragment = sellFragment;
break;
case R.id.action_chat:
selectedFragment = chatFragment;
break;
case R.id.action_notifications:
selectedFragment = notificationFragment;
break;
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (selectedFragment != null) {
transaction.replace(R.id.f_container, selectedFragment);
transaction.commit();
}
return true;
});

当用户使用导航菜单选择选项卡时,切换到所需的 fragment :

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
drawer.closeDrawers();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

switch (item.getItemId()) {
case R.id.nav_announces:
bottomNavigationView.setSelectedItemId(R.id.action_announces);
ft.replace(R.id.f_container, mainFragment);
break;
case R.id.nav_account:
bottomNavigationView.setSelectedItemId(R.id.action_account);
ft.replace(R.id.f_container, accountFragment);
break;
case R.id.nav_sell:
bottomNavigationView.setSelectedItemId(R.id.action_sell);
ft.replace(R.id.f_container, sellFragment);
break;
case R.id.nav_chat:
bottomNavigationView.setSelectedItemId(R.id.action_chat);
ft.replace(R.id.f_container, chatFragment);
break;
case R.id.nav_notifications:
bottomNavigationView.setSelectedItemId(R.id.action_notifications);
ft.replace(R.id.f_container, notificationFragment);
break;
}

ft.commit();
return true;
}

我已经 fork 了你的存储库并将其迁移到 AndroidX,然后将其修复到名为 androidx 的新分支上。我向你提出了拉取请求。您可以接受并尝试一下。

关于java - 如何协调抽屉式导航与底部导航 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55667686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com