标签: android-navigation

喷气背包组合导航旋转后数据丢失

当我在 jetpack compose 中旋转我的应用程序(带导航)时,所有数据都会重置

每次旋转后,它都会进入 Activity 的 onCreate 并再次创建 NavHost 和 ViewModel。我认为这会通过应用程序状态来处理

例子

起始活动:

class NavActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            MyAppTheme() {
                MyAppApp()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

包含 NavHost 的应用程序:

@Composable
fun MyAppApp(
    appState:  MyAppAppState = rememberAppState()
) {
        NavHost(
            navController = appState.navController,
            startDestination = Screen.ProductAddPath.route
            )
        {
            composable(Screen.ProductAddPath.route) {
                ProductEditView(
                    vm = ProductEditViewModel (appState.context)
                )
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

视图模型:

class ProductEditViewModel(context: Context) : ViewModel() {

    private val _productName = MutableStateFlow("qsd")
    val productName = …
Run Code Online (Sandbox Code Playgroud)

android-navigation android-jetpack-compose

2
推荐指数
1
解决办法
1944
查看次数

ActionBar后退箭头/按钮未出现

我使用以下方法切换我的片段:

FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.replace(R.id.main, Fragment.instantiate(MainActivity.this, fragments[pos]));
tx.addToBackStack("tag");
tx.commit();
Run Code Online (Sandbox Code Playgroud)

但是当我切换片段时,后退按钮或左插入符号没有出现在我的操作栏上.我已经设定

getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
Run Code Online (Sandbox Code Playgroud)

在主要活动,但仍然无法正常工作.

我将前两行代码放在错误的地方或类中吗?或者是我从片段导航到另一个没有显示左箭头/插入符号的片段?

android android-actionbar android-navigation

1
推荐指数
1
解决办法
6696
查看次数

导航抽屉2.3姜饼

我想在我的Android应用程序中实现导航抽屉.我使用了本教程:http://manishkpr.webheavens.com/android-navigation-drawer-example-using-fragments/ ,它显示了使用片段实现导航抽屉.但是当我试图在API 10(Gingerbread)上运行它时,我的应用程序关闭了

但它仅适用于3.0 Honeycomb +.如何在2.3 Gingerbread +和全屏模式下使其工作.我需要帮助!

提前致谢!

堆栈跟踪

01-09 16:01:07.971  16470-16470/com.Chinmay.navigationdrawer E/AndroidRuntime? FATAL     EXCEPTION: main
    java.lang.NoSuchMethodError: com.Chinmay.navigationdrawer.MainActivity.getActionBar
    at com.Chinmay.navigationdrawer.MainActivity.onCreate(MainActivity.java:25)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-navigation

1
推荐指数
1
解决办法
6462
查看次数

从顶部导航抽屉 - Android

我正在尝试在我的应用程序中实现导航抽屉.我知道它也可以在左侧和右侧制作.但它是否有可能以从顶部或底部滑入的方式实现它?

谢谢!

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

android android-navigation

1
推荐指数
1
解决办法
7162
查看次数

android.support.v7工具栏和DrawerLayout-如何更改汉堡图标

我的应用程序使用ActionBarActivity和DrawerLayout等.我想将ActionBarDrawerToggle图标更改为自定义可绘制.

在我的代码中,我使用android.support.v7.widget.Toolbar作为SupportActionBar

这是我的代码:

 toolbar.setNavigationIcon(R.drawable.lifeline_shield);
 setSupportActionBar(toolbar);
 ActionBar actionbar = getSupportActionBar();
 actionbar.setDisplayHomeAsUpEnabled(true);
 actionbar.setDisplayShowTitleEnabled(false);

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.somestring1, R.string.somestring2) ....
Run Code Online (Sandbox Code Playgroud)

但我仍然看到汉堡图标,所以我有自己的图标打开抽屉.我怎么解决这个问题?不使用弃用的api

android android-icons android-actionbar android-navigation android-toolbar

1
推荐指数
1
解决办法
6090
查看次数

返回上一个活动,并通过附加的“后退”按钮片段化

我有一个在片段之间使用标签导航的应用程序。这些片段之一可以选择打开一个新活动。当我使用此活动中的内置设备后退按钮时,它会返回到选择了上一个片段选项卡的选项卡式活动。

我通过使用以下命令向应用程序中活动的操作栏添加了后退按钮:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

并在清单中设置父活动,但是此按钮始终导航回到父活动的第一个标签,而不是先前可见的那个标签。

如何使此后退按钮的行为与设备的后退按钮相同?

android android-navigation

1
推荐指数
1
解决办法
2263
查看次数

如何在android-navigation lib上隐藏BottomNavigationView

我试图在我的APP中使用android-navigation lib,并且按照教程中的说明进行操作。我只想在我的APP中使用一个活动。我对一个问题感到困惑。有些片段只是不想要BottomNavigationView,我怎么藏起来 这是我的main_layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp"
        android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="?attr/actionBarSize"
            android:fitsSystemWindows="true"
            app:popupTheme="@style/AppTheme.PopupOverlay" >

        </androidx.appcompat.widget.Toolbar>

    </com.google.android.material.appbar.AppBarLayout>

    <fragment
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
        app:navGraph="@navigation/carkeeper_navigation"/>

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/menu_bottom_nav"
    app:itemTextColor="@color/bottom_nav_title_color_selector"
    app:itemIconSize="@dimen/x40"
    app:menu="@menu/menu_main_bottom_nav"
    app:labelVisibilityMode="labeled">

</com.google.android.material.bottomnavigation.BottomNavigationView>
Run Code Online (Sandbox Code Playgroud)

这是我的主要活动

class MainActivity : BaseActivity() {

private lateinit var navController: NavController
private lateinit var bottomNavigationView: BottomNavigationView
private lateinit var appBarConfiguration: AppBarConfiguration

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.home_activity)

    navController = Navigation.findNavController(this, R.id.nav_host_fragment)
    appBarConfiguration = AppBarConfiguration(navController.graph, null)
    setSupportActionBar(findViewById(R.id.toolbar))

    bottomNavigationView …
Run Code Online (Sandbox Code Playgroud)

android android-navigation

1
推荐指数
4
解决办法
1495
查看次数

在Android中使用导航组件时如何删除默认动画过渡?

我正在使用导航组件,并且在主活动中有一个底部导航视图。当我点击该底部导航视图中的选项卡时,出现该片段时似乎动画淡入了。我认为我没有手动设置动画,似乎默认情况下该动画会存在。

我想删除该动画。这是我在主要活动中使用的代码。

class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener {

    private lateinit var navController : NavController
    lateinit var destinationTitleTextView : TextView
    lateinit var progressBar : ProgressBar
    lateinit var topToolbar : Toolbar
    lateinit var bottomNavigationView : BottomNavigationView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        FirebaseApp.initializeApp(this)

        // Initial Setup views
        navController = Navigation.findNavController(this,R.id.nav_host_fragment)
        setupBottomNavMenu(navController)
        setupActionBar(navController)
        setUpViewDeclaration()


        // Add Listeners
        navController.addOnDestinationChangedListener(this)


    }



    private fun setUpViewDeclaration() {
        destinationTitleTextView = findViewById(R.id.destination_label_text_view)
        progressBar = findViewById(R.id.progressBar_main_activity)
        topToolbar = findViewById(R.id.top_toolbar)
        bottomNavigationView = findViewById(R.id.bottom_nav)

    }

    private fun setupBottomNavMenu(navController: NavController) {
        bottom_nav.setupWithNavController(navController) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-navigation android-architecture-components android-jetpack

1
推荐指数
2
解决办法
1158
查看次数

为什么Dialog没有NavController [Missing]?

我正在尝试在应用程序中使用Nav Component的最新更新

我可以在其中添加dialog(BottomSheetDialogFragmentnav graph

nav_version = "2.1.0-alpha05"
Run Code Online (Sandbox Code Playgroud)

来自我的部分代码nav_graph

    <dialog
        android:id="@+id/settingFragment"
        android:name="com.andor.navigate.notepad.listing.fragment.SettingFragment"
        tools:layout="@layout/fragment_setting">
        <action
            android:id="@+id/action_settingFragment_to_confirmationFragment"
            app:destination="@id/confirmationFragment" />
    </dialog>
    <dialog
        android:id="@+id/confirmationFragment"
        android:name="com.andor.navigate.notepad.ConfirmationFragment"
        tools:layout="@layout/fragment_confirmation" />
Run Code Online (Sandbox Code Playgroud)

在我的设置片段中,我有一个button(logout_btn)来触发动作:action_settingFragment_to_confirmationFragment

OnActivityCreated设置片段中的代码:

    logout_btn.setOnClickListener {
       Navigation.findNavController(view!!).navigate(R.id.action_settingFragment_to_confirmationFragment)
    } 
Run Code Online (Sandbox Code Playgroud)

当我单击按钮时,出现运行时异常:

java.lang.IllegalStateException:查看androidx.constraintlayout.widget.ConstraintLayout {550ae09 VE ............. 1,1-719,526}在androidx.navigation.Navigation.findNavController上未设置NavController (Navigation.java:84)在com.andor.navigate.notepad.listing.fragment.SettingFragment $ onActivityCreated $ 2.onClick(SettingFragment.kt:56)在android.view.View.performClick(View.java:7352) .view.View.performClickInternal(View.java:7318)在android.view.View.access $ 3200(View.java:846)在android.view.View $ PerformClick.run(View.java:27800)在android.os android.os.Handler.dispatchMessage(Handler.java:99)位于android.os.Looper.loop(Looper.java:214)位于android.app.ActivityThread处的.Handler.handleCallback(Handler.java:873)。com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)的java.lang.reflect.Method.invoke(本机方法)的main(ActivityThread.java:7045) os.ZygoteInit.main(ZygoteInit.java:965)

我的目的是从另一个对话框打开一个对话框,但是由于某种原因,我的对话框没有(缺少)NavController。

我已经提到了源代码

android kotlin android-navigation android-architecture-navigation androidx

1
推荐指数
1
解决办法
1377
查看次数

拦截 NavigationUI.onNavDestinationSelected() 以使用“inclusive = true”使 backstack 弹出

我已经连接了我的菜单 xml 和 Android 导航组件navigation_view.setupWithNavController(navController),一切正常。我的菜单的一部分是注销选项。如果用户选择此导航目的地,应用程序应导航到AuthorizationFragment 并将返回堆栈弹出到此 Fragment 并将 inclusive 设置为 true以删除所有先前的Fragment

我查看了导航库的代码,并达到了应该发生这种情况的地步:

NavigationUI.onNavDestinationSelected():

/**
 * Attempt to navigate to the {@link NavDestination} associated with the given MenuItem. This
 * MenuItem should have been added via one of the helper methods in this class.
 *
 * <p>Importantly, it assumes the {@link MenuItem#getItemId() menu item id} matches a valid
 * {@link NavDestination#getAction(int) action id} or
 * {@link NavDestination#getId() destination id} to be navigated to.</p>
 * <p> …
Run Code Online (Sandbox Code Playgroud)

android navigation-drawer android-navigation android-navigationview android-jetpack

1
推荐指数
1
解决办法
2372
查看次数