当前位置: 首页 > news >正文

各网站收录做网站用买服务器码

各网站收录,做网站用买服务器码,海外购物网,企业展厅设计内容Android Navigation 如何动态的更换StartDestination 保存Fragment状态 Navigation(一)基础入门 google 官网 #xff1a; Navigation 导航 路由 讨论了两年的 Navigation 保存 Fragment 状态问题居然被关闭了 Navigation是一种导航的概念#xff0c;即把Activ…Android Navigation 如何动态的更换StartDestination 保存Fragment状态 Navigation(一)基础入门 google 官网 Navigation 导航 路由 讨论了两年的 Navigation 保存 Fragment 状态问题居然被关闭了 Navigation是一种导航的概念即把Activity和fragment当成一个个的目的地Destination各目的地形成一张导航图NavGraph由导航控制器NavController来统一调度跳转 单个Activity嵌套多个Fragment的UI架构方式已被大多数Android工程师所接受和采用。但是对Fragment的管理一直是一个比较麻烦的事情工程师需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。这其中还包括了对应用程序的App bar的管理Fragment间的切换动画Fragment间的参数传递总之使用起来不是特别友好。 为此Android Jetpack提供的一个名为Navigation的UI架构组件。旨在方便我们管理Fragment页面。它具体有以下优势 可视化的页面导航图类似xcode中的StoryBoard便于我们看清页面之间的关系通过destination和action来完成页面间的导航方便的页面切换动画页面间类型安全的参数传递通过NavigationUI类对菜单底部导航抽屉菜单导航进行方便统一的管理深层链接 注意在Android Studio3.2及以上版本才能支持Navigation特性。 本文所说的“页面”包括了Fragment和Activity但主要是Fragment因为Navigation组件的主要目地就是方便我们在一个Activity中对多个Fragment进行管理。 首先我们需要先对Navigation有一个大致的了解。 Navigation Graph 这是一种新型的XML资源文件里面包含了应用程序所有的页面及页面之间的关系 NavHostFragment 这是一个特殊的布局文件Navigation Graph中的页面通过该Fragment展示 NavController 这是一个Java/Kotlin对象用于在代码中完成Navigation Graph中具体的页面切换 当你想要切换页面的时候使用NavController对象告诉它你想要去Navigation Graph中的哪个页面NavController会将相关的页面展示在NavHostFragment中。 创建工程引入依赖 android {compileSdkVersion 30buildToolsVersion 30.0.3defaultConfig {applicationId com.xq.mybottomnavigationminSdkVersion 29targetSdkVersion 30versionCode 1versionName 1.0}buildFeatures {viewBinding true} }dependencies {implementation androidx.appcompat:appcompat:1.2.0implementation com.google.android.material:material:1.2.1implementation androidx.constraintlayout:constraintlayout:2.0.1testImplementation junit:junit:4.androidTestImplementation androidx.test.ext:junit:1.1.2androidTestImplementation androidx.test.espresso:espresso-core:3.3.0implementation androidx.lifecycle:lifecycle-livedata-ktx:2.2.0implementation androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0implementation androidx.navigation:navigation-fragment:2.0.0implementation androidx.navigation:navigation-ui:2.0.0 }MainActivity和布局 import android.os.Bundle;import com.google.android.material.bottomnavigation.BottomNavigationView;import androidx.appcompat.app.AppCompatActivity; import androidx.navigation.NavController; import androidx.navigation.Navigation; import androidx.navigation.ui.AppBarConfiguration; import androidx.navigation.ui.NavigationUI;import com.xq.mybottomnavigation.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {private ActivityMainBinding binding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());BottomNavigationView navView findViewById(R.id.nav_view);// Passing each menu ID as a set of Ids because each// menu should be considered as top level destinations.//获取App bar配置AppBarConfigurationAppBarConfiguration appBarConfiguration new AppBarConfiguration.Builder(R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications).build();NavController navController Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);//将NavController和AppBarConfiguration进行绑定NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);//将需要交互的App barUI与NavController和AppBarConfiguration进行绑定NavigationUI.setupWithNavController(binding.navView, navController);}}navigation pop 和 push的时候 对Fragment的 操作是 replace所以会导致生命周期重新走一遍 其实Navigation使用很简单navigation和activity确切的说是Fragment绑定之后使用两个方法就行一个是navigate就是跳转一个是navigateUp就是返回。 如果想要跳转到新页面时在Fragment中使用 NavHostFragment.findNavController(this).navigate(destinationID, bundle); NavHostFragment.findNavController(this).navigateUp();布局 ?xml version1.0 encodingutf-8? androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:idid/containerandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:paddingTop?attr/actionBarSizecom.google.android.material.bottomnavigation.BottomNavigationViewandroid:idid/nav_viewandroid:layout_width0dpandroid:layout_heightwrap_contentandroid:layout_marginStart0dpandroid:layout_marginEnd0dpandroid:background?android:attr/windowBackgroundapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintLeft_toLeftOfparentapp:layout_constraintRight_toRightOfparentapp:menumenu/bottom_nav_menu /fragmentandroid:idid/nav_host_fragment_activity_mainandroid:nameandroidx.navigation.fragment.NavHostFragmentandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentapp:defaultNavHosttrueapp:layout_constraintBottom_toTopOfid/nav_viewapp:layout_constraintLeft_toLeftOfparentapp:layout_constraintRight_toRightOfparentapp:layout_constraintTop_toTopOfparentapp:navGraphnavigation/mobile_navigation //androidx.constraintlayout.widget.ConstraintLayoutNavHostFragment android:nameandroidx.navigation.fragment.NavHostFragment这句话是在告诉系统这是一个特殊的Fragment 。 app:defaultNavHost“true” app:defaultNavHosttrue将defaultNavHost属性设置为true则该Fragment会自动处理系统返回键即当用户按下手机的返回按钮时系统能自动将当前的Fragment推出。 app:navGraph“navigation/nav_graph” app:navGraphnavigation/nav_graph设置该Fragment对应的导航图 。 导航图文件 navigation/mobile_navigation ?xml version1.0 encodingutf-8? navigation xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:idid/mobile_navigationapp:startDestinationid/navigation_homefragmentandroid:idid/navigation_homeandroid:namecom.xq.mybottomnavigation.ui.home.HomeFragmentandroid:labelstring/title_hometools:layoutlayout/fragment_home /fragmentandroid:idid/navigation_dashboardandroid:namecom.xq.mybottomnavigation.ui.dashboard.DashboardFragmentandroid:labelstring/title_dashboardtools:layoutlayout/fragment_dashboard /fragmentandroid:idid/navigation_notificationsandroid:namecom.xq.mybottomnavigation.ui.notifications.NotificationsFragmentandroid:labelstring/title_notificationstools:layoutlayout/fragment_notifications / /navigationfragment 三个fragment类似 import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider;import com.xq.mybottomnavigation.R; import com.xq.mybottomnavigation.databinding.FragmentHomeBinding;public class HomeFragment extends Fragment {private HomeViewModel homeViewModel;private FragmentHomeBinding binding;public View onCreateView(NonNull LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {homeViewModel new ViewModelProvider(this).get(HomeViewModel.class);binding FragmentHomeBinding.inflate(inflater, container, false);View root binding.getRoot();final TextView textView binding.textHome;homeViewModel.getText().observe(getViewLifecycleOwner(), new ObserverString() {Overridepublic void onChanged(Nullable String s) {textView.setText(s);}});return root;}Overridepublic void onDestroyView() {super.onDestroyView();binding null;}}?xml version1.0 encodingutf-8? androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.ui.home.HomeFragmentTextViewandroid:idid/text_homeandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_marginStart8dpandroid:layout_marginTop8dpandroid:layout_marginEnd8dpandroid:textAlignmentcenterandroid:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent / /androidx.constraintlayout.widget.ConstraintLayout其他 Activity中导航到指定fragment //方式一 、 通过NavController NavController controller Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); binding.btn1.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {controller.navigate(R.id.navigation_notifications);} });//方式二 、 通过NavHostFragment NavHostFragment fragment (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_activity_main); binding.btn2.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {if (fragment ! null) {NavHostFragment.findNavController(fragment).navigate(R.id.navigation_notifications);}} });NotificationsFragment 返回上一级 textView.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {NavHostFragment.findNavController(NotificationsFragment.this).navigateUp();} });动态设置 navGraph传参数 MainActivity 发送数据 NavController controller Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); NavInflater navInflater controller.getNavInflater(); NavGraph navGraph navInflater.inflate(R.navigation.mobile_navigation); navGraph.setStartDestination(R.id.navigation_notifications);//初始界面Bundle args new Bundle(); args.putBoolean(6no6, true);//传参navController.setGraph(navGraph, args);或者 //动态加载setGraph FragmentManager manager getSupportFragmentManager(); NavHostFragment hostFragment (NavHostFragment) manager.findFragmentById(R.id.nav_host_fragment_activity_main); NavController controller null; if (hostFragment ! null) {controller hostFragment.getNavController(); } navController.setGraph(R.navigation.mobile_navigation);NotificationsFragment 接收数据 Bundle arguments getArguments(); if (arguments ! null) {boolean aBoolean arguments.getBoolean(6no6);textView.setTextColor(aBoolean ? Color.RED : Color.BLUE); }导航监听 navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {Overridepublic void onDestinationChanged(NonNull NotNull NavController controller,NonNull NotNull NavDestination destination,Nullable Bundle arguments) {CharSequence label destination.getLabel();Log.e(TAG, onDestinationChanged: label);} });切换时使Fragment保存状态 在进行跳转时 直接使用了replace所以导致当前页面会调用 onDestroyView即fragment变为 inactive当进行pop操作时fragment重新进入 active状态时会重新调用 onViewCreated 等方法导致页面重新绘制 其实在这种情况下我们可以直接用ViewModel和LiveData对数据进行保存但是这次想尝试一下新的解决办法。 在知道原因后就好办了直接继承FragmentNavigator把方法重写 public NavDestination navigate(NonNull Destination destination, Nullable Bundle args,Nullable NavOptions navOptions, Nullable Navigator.Extras navigatorExtras) {// ft.replace(mContainerId, frag);// change to if(mFragmentManager.getFragments().size()0){ft.hide(mFragmentManager.getFragments().get(mFragmentManager.getFragments().size()-1));ft.add(mContainerId, frag);}else {ft.replace(mContainerId, frag);}}KeepStateFragmentNavigator 使用如下 NavController navController Navigation.findNavController(this, R.id.nav_host_fragment); Fragment navHostFragment getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); navController.getNavigatorProvider().addNavigator(new KeepStateFragmentNavigator(this, navHostFragment.getChildFragmentManager(), R.id.nav_host_fragment)); NavHostFragment.findNavController(this).navigate(destinationID, bundle);
http://www.zqtcl.cn/news/512444/

相关文章:

  • 做网站和做公众号资金盘网站怎么建设
  • 全国最好的网站建设案例推广方法视频
  • 嘉兴网站建设策划方案在海口注册公司需要什么条件
  • 旅游网站国际业务怎样做建设企业官方网站企业登录
  • 北京市昌平网站建设小米网络营销案例分析
  • 怎么利用360域名做网站微信商城怎么弄
  • 中山h5网站建设天津网站建设技术托管
  • 建网站买的是什么商城网站建设合同
  • 购物网站制作样例有没有专门学做婴儿衣服的网站
  • 济南网站建设 找小七买友情链接有用吗
  • 南阳网站建设域名公司泉州关键词排名seo
  • 网站建设在线推广宁夏快速自助制作网站
  • 专业网站建设好不好wordpress编辑文章更新失败
  • 河南郑州网站建设哪家公司好html5 网站正在建设中
  • 免费ppt模板下载医学类江门seo网站推广
  • 智慧软文网站群辉wordpress地址
  • 自己怎么做拼单网站外贸网站 源码
  • 做网站如何防止被黑网页无法访问如何解决360浏览器
  • 专门做设计的网站互联网运营培训班哪个好
  • 烟台网站建设网站推广做网站与数据库的关系
  • 深圳网站设计成功刻成全视频免费观看在线看第7季高清
  • 淮阳城乡建设局网站seo技术团队
  • 建设博客网站游戏交易类网站seo怎么做
  • 做系统软件的网站wordpress网站会员太多
  • 上海门户网站怎么登录网站开发竞价单页
  • 东莞市外贸网站建设公司软件开发 系统开发 网站开发服务
  • 泉州制作网站设计南宁网站排名外包
  • 南通网站建设入门wordpress google seo
  • 怎么建立图片的网站吗网站响应式是什么意思
  • 网站建设买了服务器后怎么做WordPress多城市