今日想法
今天是想把做一个跳转页面的时候调到H5页面去,但是这个页面我用app来承载,不要调到浏览器去。
所以用到了下方三个东西。
Viewbinding
build.gradle配置
首先在app模块的build.gradle里添加一下代码
默认情况下,每一个布局xml文件都会生成一个对应的Binding类
当然,如果不需要为该xml生成Binding类,可以在xml的根布局中配置tools:viewBindingIgnore=“true”。
传统设置布局
setContentView(R.layout.activity_web_view_to_h5);
viewbinding设置布局(Activity)
binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot());
用法也很简单,在Activity的生命周期oncreate()中,直接通过binding点名字的方式就可以获取到控件实例,消除了findViewById的模版代码。
这里可以看到,setContentView的入参写法都变了,因为可通过XXXBinding类的getRoot函数获取到布局的根View,再通过setContentView添加到Activity。
viewbinding设置布局(Fragment)
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentLoginBinding.inflate(inflater,container,false); return binding.getRoot(); }
viewbinding设置布局(RecyclerView.Adapter)
调用控件
binding.控件ID即可。
WebView
首先我新创了一个空的Activity,添加代码。
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.activity.WebViewToH5"> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/web"/> </androidx.constraintlayout.widget.ConstraintLayout>
package com.example.intelligentwatch.ui.activity; import android.os.Bundle; import android.webkit.WebChromeClient; import android.webkit.WebViewClient; import androidx.appcompat.app.AppCompatActivity; import com.example.intelligentwatch.databinding.ActivityWebViewToH5Binding; public class WebViewToH5 extends AppCompatActivity { private ActivityWebViewToH5Binding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityWebViewToH5Binding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); //设置WebView支持JavaScript脚本 binding.web.getSettings().setJavaScriptEnabled(true); //当需要跳转网页时目标网页仍在当前WebView中显示 binding.web.setWebViewClient(new WebViewClient()); //当需要跳转网页的时候直接调到系统浏览器去显示 // binding.web.setWebChromeClient(new WebChromeClient()); //传入相应浏览器网址,即可展示相应网页内容,这里用的是百度 binding.web.loadUrl("https://baidu.com"); } }
跳转到这个Activity就可以自动打开百度了。
Navigation
这是jetpack库中的一个框架,只能绑定在FragmentContainerView容器中,一个FragmentContainerView容器对应绑定一个navigation文件。
从Fragment跳到Fragment或Activity都可以。
但是Activity跳到Fragment或Activity之间的跳转就只能老老实实startActivity了。
所以开头只能是Fragment,不然怎么叫FragmentContainerView容器呢?
FragmentContainerView容器
用来承载fragment的。
本来是叫fragment的,不过androidx更新后现在推荐叫FragmentContainerView,也就是下面这个。用 app:navGraph="@navigation/nav_graph" /> 来绑定navigation进行页面的跳转。
<androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment_content_main" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="0dp" android:layout_height="0dp" app:defaultNavHost="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:navGraph="@navigation/nav_graph" /> </androidx.constraintlayout.widget.ConstraintLayout>
navigation绑定和跳转目标
注释都写了,自己看吧。
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" <!--给fragmentUI控件绑定--> android:id="@+id/nav_graph.xml" <!--fragment初始页是哪个--> app:startDestination="@id/LoginFragment"> <fragment <!-- 设置id别人才找得到--> android:id="@+id/LoginFragment" <!-- 会自动搜你项目的所有fragment,让你选择这个子元素哪个fragment--> android:name="com.example.intelligentwatch.ui.fragment.LoginFragment"> <action <!--这个动作的名字,给点击事件绑定的--> android:id="@+id/toAboutActivity" <!--跳到哪个地方--> app:destination="@id/about_activity"/> <action android:id="@+id/action_LoginFragment_to_WebView_activity" app:destination="@id/WebView_activity" /> </fragment> <activity android:id="@+id/about_activity" android:name="com.example.intelligentwatch.ui.activity.AboutCompany_Activity"> </activity> <activity android:id="@+id/WebView_activity" android:name="com.example.intelligentwatch.ui.activity.WebViewToH5_Activity"> </activity> </navigation>
也可以在design页面进行可视化设置。
通过小圆球拖动,来指定调到哪个fragment。
点击事件中绑定
@Override public void onClick(View v) { int id = v.getId(); switch (id){ case R.id.button_first: Navigation.findNavController(v).navigate(R.id.WebView_activity); break; default: break; } }
大功告成。
过几天再康康Glide图片加载框架的使用。