我试图设置一个显示3个片段的底部导航。
问题是,该应用程序完全适用于Android 5.0,但在Android 6.0及更高版本上抛出错误...
SdkVersion 26-minSdkVersion 21-塔吉特SdkVersion 26-
可以肯定的是,我一直在使用这个例子来构建这个应用程序,在我的代码中实现了这个方法之后,仍然会抛出一个异常。
提前感谢您的帮助。
错误:
AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.samsung.auto_temperatura, PID: 8129
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.samsung.auto_temperatura/com.example.samsung.auto_temperatura.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.BottomNavigationView.setOnNavigationItemSelectedListener(android.support.design.widget.BottomNavigationView$OnNavigationItemSelectedListener)' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.BottomNavigationView.setOnNavigationItemSelectedListener(android.support.design.widget.BottomNavigationView$OnNavigationItemSelectedListener)' on a null object reference
主要活动
public class MainActivity extends AppCompatActivity {
public static final String FRAGMENT_USTAWIENIA = "FRAGMENT_USTAWIENIA";
public static final String FRAGMENT_CZUJNIKI = "FRAGMENT_CZUJNIKI";
public static final String FRAGMENT_ROZLACZ = "FRAGMENT_ROZLACZ";
private static final String TAG = MainActivity.class.getSimpleName();
// I think here goes something wrong...
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_ustawienia:
replaceFragment(UstawieniaFragment.newInstance(),FRAGMENT_USTAWIENIA);
return true;
case R.id.action_czujniki:
replaceFragment(CzujnikiFragment.newInstance(),FRAGMENT_CZUJNIKI);
return true;
case R.id.action_rozlacz:
replaceFragment(RozlaczFragment.newInstance(),FRAGMENT_ROZLACZ);
return true;
}
return false;
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navigation = findViewById(R.id.bottom_navigation);
navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_ustawienia:
replaceFragment(UstawieniaFragment.newInstance(),FRAGMENT_USTAWIENIA);
return true;
case R.id.action_czujniki:
replaceFragment(CzujnikiFragment.newInstance(),FRAGMENT_CZUJNIKI);
return true;
case R.id.action_rozlacz:
replaceFragment(RozlaczFragment.newInstance(),FRAGMENT_ROZLACZ);
return true;
}
return false;
}
});
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, CzujnikiFragment.newInstance(), FRAGMENT_CZUJNIKI)
.commit();
}
private void replaceFragment(Fragment newFragment, String tag) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, newFragment, tag)
.commit();
}
}
主要活动XML:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.example.samsung.auto_temperatura.MainActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentInsetLeft="0dp"
android:elevation="4dp"
android:fitsSystemWindows="true"
android:minHeight="?attr/actionBarSize"
android:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:titleTextColor="@color/bialy"
app:contentInsetRight="0dp">
<ImageView
android:layout_width="100dp"
android:layout_height="40dp"
android:src="@drawable/imkapknapis"
android:layout_marginRight="12dp"/>
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginRight="4dp"
android:text="STAN CZUJNIKÓW:"
android:visibility="visible"
android:textStyle="bold"/>
<TextView
android:id="@+id/stan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="DOBRY"
android:textStyle="bold"/>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bottom_navigation" />
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_gravity="bottom"
app:itemBackground="@color/bialy"
app:itemIconTint="@color/imkNiebieski"
app:itemTextColor="@color/czarny"
app:menu="@menu/nav_items"
/>
片段示例XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerviewID"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_marginTop="24dp"
android:clickable="true"
android:clipChildren="false"
android:clipToPadding="false" />
BottomNavigationView navigation = findViewById(R.id.bottom_navigation);
findViewById在代码中返回null。你能附上活动和片段的布局XML文件吗?。确保您拥有布局id为R.id.bottom_navigation的视图。
我的主要活动中有一个底部导航栏。通过单击底部导航中的一个选项卡,我想更改视图中的片段。我有以下代码:主要活动: } 我的一个片段: 如果我单击其中一个选项卡,就会显示正确的片段,因此这是可行的。然而,当新片段出现时,我想单击另一个选项卡来显示另一个片段,这就行不通了。底部导航栏不会对单击做出反应。甚至日志。i语句不起作用,因此似乎没有调用导航项SelectedListener。 我对android
我创建了一个带有底部导航栏的活动。我在谷歌上搜索了很多关于它的信息,但现在我不知道如何准确地处理这个问题。之前,当用户点击底部导航时,我刚刚开始了另一个活动,但我认为这不好。 如何在选项卡之间切换?我必须处理碎片吗?那么“setContentView(int layoutResID)”呢?我该怎么做?我很困惑。。。 非常感谢你的帮助——我希望你明白我的意思。
我是Android开发新手,所以我不明白很多,也许是基本的东西,也许甚至陈述的主题也没有完全反映我的问题,我事先道歉,我不能更准确地表述。请帮我回答一些问题。 我的应用程序中有一个底部导航,有三个菜单项。就像图片上一样: 底部导航 最初,我是按照标准的Android Studio示例来做的: 在这段代码中,菜单项切换片段,保存每个片段的状态(我不知道具体如何,它似乎在导航控制器内部的某个地方)。
我有底部的导航栏,点击导航栏中的项目,我正在替换片段。我有3个片段A、B、C,所以点击B项B片段被加载,在B中我调用3-4个API。所以现在如果我转到C,然后再次转到B,将创建一个新的B片段实例,并再次调用这些API,那么如何保存片段实例状态,并且在更改片段时不再调用API。这是我的密码。 我已经在MainActivity的onCreate中初始化了上面的片段成员变量
我创建了一个带有“底部导航活动”的新项目: 这是生成的代码: 如何使用底部栏更改为新片段?例如,我有3个片段:Fragment1 Fragment2和Fragment3,我想用底部栏中的3个按钮更改为它们。我还想通过左右滑动手指来切换片段,我该怎么做?
实现tabbar建议采用小程序原生的tabbar,通过设置page/main.js(即对应小程序中app.json)来实现,详情请看小程序文档。示例如下,仅作参考: tabBar: { color: '#999999', selectedColor: '#1AAD16', backgroundColor: '#ffffff', borderStyle: 'white', /*