我正在使用带有底部导航视图的简单应用程序。我有3个带有文本的片段,我想在Botton
Navigation中选择一个项目时启动它们,但是我不知道在MainActivity.java中写什么。所有片段都具有.xml布局和.java。我搜索了一些代码,写了代码,搜索了视频,但没有成功。
我正在学习Fragments和UI Dynamic,因此我在Android
Studio中使用“底部导航活动”创建了一个新项目。因此,在我的activity_main中,我在“底部导航”中有3个iten,在“底部导航”之上有一个framelayout,并占用了所有父对象。这个想法是:当我在“底部导航”中选择一个项目时,它将在框架布局中显示另一个布局。所以我在布局文件夹中创建了3个xml布局(也带有java类),在framelayout中创建了一个片段。现在,当我选择一个项目时,我试图在我的framelayout(有一个片段)中显示这些布局。但是我不知道该怎么做。
主要活动
private TextView mTextMessage;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.navigation_home:
selectedFragment = HomeFragment.newInstance();
break;
case R.id.navigation_dashboard:
selectedFragment = DashboardFragment.newInstance();
break;
case R.id.navigation_notifications:
selectedFragment = NotificationsFragment.newInstance();
break;
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content, selectedFragment);
transaction.commit();
return true;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content, HomeFragment.newInstance());
transaction.commit();
}
activity_main xml
<LinearLayout
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/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="bandeira.thalisson.barradenavegacaoembaixo.MainActivity">
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</FrameLayout>
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?android:attr/windowBackground"
app:menu="@menu/navigation"/>
导航xml
<item
android:id="@+id/Fragment_one"
android:icon="@drawable/ic_home_black_24dp"
android:title="@string/title_home"/>
<item
android:id="@+id/Fragment_two"
android:icon="@drawable/ic_dashboard_black_24dp"
android:title="@string/title_dashboard"/>
<item
android:id="@+id/Fragment_three"
android:icon="@drawable/ic_notifications_black_24dp"
android:title="@string/title_notifications"/>
Fragment.java示例
public class HomeFragment extends Fragment {
public static HomeFragment newInstance() {
HomeFragment fragment = new HomeFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.navigation_home, container, false);
return inflater.inflate(R.layout.navigation_home, container, false);
}
首先,在您的activity_main.xml中,我们不需要3个不同的片段,因为我们只能在1个FrameLayout中替换或添加任何选定的片段。其次,只要用户从Bottom
NavigationView中选择任何一个,就只需获取相关Fragment类的实例,并将其替换为activity_main的FrameLayout即可。
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.navigation_home:
selectedFragment = FunFragment.newInstance();
break;
在获得选定片段的实例后,将其替换为activity_main的FrameLayout,以显示在屏幕上。
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content, selectedFragment);
transaction.commit();
编辑标记 步骤1. 您的activity_main.xml应该如下所示
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.exampl.MainActivity">
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?android:attr/windowBackground"
app:menu="@menu/navigation" />
</LinearLayout>
步骤2. 您的fragment_home.xml布局应如下所示
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="android"/>
</LinearLayout>
为您的三个不同选项制作3种不同的片段布局
步骤3. 您的MainActivity.java类将如下所示
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.navigation_home:
selectedFragment = FunFragment.newInstance();
break;
case R.id.navigation_dashboard:
selectedFragment = TheoryFragment.newInstance();
break;
case R.id.navigation_notifications:
selectedFragment = AndroidFragment.newInstance();
break;
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content, selectedFragment);
transaction.commit();
return true;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content, FunFragment.newInstance());
transaction.commit();
}
在on create上替换为要在启动应用程序后显示的片段,导航监听器将照顾您将选择的任何选项
步骤4. 您将拥有3个不同的Fragment类,如下所示
public class TheoryFragment extends Fragment {
public static TheoryFragment newInstance() {
TheoryFragment fragment = new TheoryFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_theory, container, false);
unbinder = ButterKnife.bind(this, rootView);
return rootView;
}
}
希望它能对您有所帮助,如有任何问题,请告诉我。
我在我的一个活动中使用了Android设计支持库中的BottomNavigationView,以及每个导航项的片段。 每次我在栏上选择一个项目时,我都会进行一个片段交易,就像下面的片段一样(为了简洁起见,删除了代码的某些部分): 问题是...底部栏动画变得超级滞后,只有在片段完全加载并显示在屏幕上后才会完成。 这个问题并不完全是新问题,因为在使用导航菜单时也会发生,但至少可以通过使用抽屉布局来解决
这是我第一次尝试开发android应用程序。 我有一个带有ConstraintLayout的MainActivity,它具有BottomNavigationView。每当选择第一个导航项时,我想显示一个类别列表(显示在片段中),然后每当选择此类别时,将显示与该特定类别相关的另一个列表(显示在另一个片段中)。 我读到(Android-fragment.replace()不替换内容-将其放在顶部)它指
问题内容: 我有一堂课,称为extends 。 现在,在我的父级活动中,我想“运行”此片段。 这是我的: 如何运行/启动片段?我希望我的方法可以触发。 问题答案: 有很多文档!您需要的一切已经在这里。 当然,您需要在活动布局中使用该容器。
我有两个碎片,两个碎片上都有一个按钮。当我按下按钮时,我想开始一项新的活动。但我不能让它工作。 我得到的错误:这里的错误:类型不匹配:无法从mFragmentFavorite转换为片段 我做错了什么? 我的碎片寻呼机适配器 收藏夹 如果FavoriteActivity扩展了片段,那么错误就消失了,但是我在findViewById(R.id.mainFavorite)处得到了一个错误 错误为 fin
我已经想从我的Main活动启动我的RecipientFra法规,并从我的Main活动将数据传递到Fra法规。这是我实现的代码。但是碎片没有开始。 我还想知道如何传递intent.set数据,并在碎片中获取数据。目前我有以下代码: 受体片段 主要活动
我有一个带有的布局,属性设置为: 菜单有五项: 第三项标签过长(第二个单词没有省略,只是没有显示): 标签稍微短一点会导致正确的行为: 有没有办法处理更长的标签?最好的解决方案是省略号并显示“更长的文本…”当全文没有空间时。