全屏

主界面

底部导航,bottombar

添加依赖

implementation 'com.roughike:bottom-bar:2.3.1'

主界面布局

<com.roughike.bottombar.BottomBar
android:id="@+id/bottomBar"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
app:bb_tabXmlResource="@xml/bottombar_tabs" />

创建布局文件

xml/bottombar_tabs.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<tabs>
<tab
id="@+id/tab_home"
icon="@drawable/ic_home"
title="主页" />
<tab
id="@+id/tab_favorites"
icon="@drawable/ic_favorites"
title="收藏" />
<tab
id="@+id/tab_message"
icon="@drawable/ic_message"
title="消息" />
<tab
id="@+id/tab_my"
icon="@drawable/ic_my"
title="个人中心" />
</tabs>
</PreferenceScreen>

(PreferenceScreen提示已被弃用)

监听BottomBar点击事件,切换Fragment

创建BaseFragment基类

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment abstract class BaseFragment:Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
init()
} open protected fun init() {
} override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return initView()
} abstract fun initView(): View? override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
onListener()
} open protected fun onListener() {
} }

创建四个Fragment类继承自BaseFragment,并配置布局文件

import android.view.View
import com.vocus.playertest.R
import com.vocus.playertest.base.BaseFragment class FavoritesFragment:BaseFragment() {
override fun initView(): View? {
return View.inflate(context,R.layout.fragment_home,null)
}
}

创建FragmentUtil管理fragment

import com.vocus.playertest.R
import com.vocus.playertest.base.BaseFragment
import com.vocus.playertest.fragment.FavoritesFragment
import com.vocus.playertest.fragment.HomeFragment
import com.vocus.playertest.fragment.MessageFragment
import com.vocus.playertest.fragment.MyFragment class FragmentUtil private constructor(){ //单例模式
val homeFragment by lazy{ HomeFragment()}
val favoritesFragment by lazy{ FavoritesFragment()}
val messageFragment by lazy{ MessageFragment() }
val myFragment by lazy{ MyFragment() } companion object{
val fragmentUtil by lazy{
FragmentUtil()
}
} fun getFragment(tabId:Int):BaseFragment?{
when(tabId){
R.id.tab_home->return homeFragment
R.id.tab_favorites->return favoritesFragment
R.id.tab_message->return messageFragment
R.id.tab_my->return myFragment
}
return null
} }

设置监听

override fun setOnListener() {
bottomBar.setOnTabSelectListener{
val transaction=supportFragmentManager.beginTransaction()
transaction.replace(R.id.container,FragmentUtil.fragmentUtil.getFragment(it)!!,it.toString())
transaction.commit()
}

顶部<Toolbar>

activity_main.xml中

<include layout="@layout/toobar"/>

添加布局文件toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="?attr/actionBarSize"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/colorPrimary"
android:id="@+id/toolBar"
app:titleTextColor="#fff"></androidx.appcompat.widget.Toolbar>

创建ToolbarMananger接口管理toolbar

1.添加设置按钮
2.设置按钮点击监听,跳转到设置页面
ToolbarMananger.kt
import android.content.Intent
import android.view.MenuItem
import androidx.appcompat.widget.Toolbar
import com.vocus.playertest.R
import com.vocus.playertest.ui.activity.SettingActivity interface ToolbarMananger {
val toolbar: Toolbar fun initMainToolbar() {
toolbar.setTitle("一出好戏")
toolbar.inflateMenu(R.menu.main)
toolbar.setOnMenuItemClickListener(object :Toolbar.OnMenuItemClickListener{
override fun onMenuItemClick(item: MenuItem?): Boolean {
when(item?.itemId){
R.id.setting->toolbar.context.startActivity(Intent(toolbar.context, SettingActivity::class.java))
}
return true
}
})
}
}

MainActivity.kt

class MainActivity : BaseActivity() ,ToolbarMananger{
override val toolbar: Toolbar by lazy{
find<Toolbar>(R.id.toolBar)
} override fun getLayoutId(): Int {
return R.layout.activity_main
} override fun init() {
initMainToolbar()
}
}

menu/main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/setting"
android:icon="@drawable/menu_setting1"
android:title="设置"
app:showAsAction="always"/>
</menu>

3.设置界面布局

(1)添加toolbar

(2)添加fragment

<?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">
<include layout="@layout/toobar"/>
<fragment
android:id="@+id/settingFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.vocus.playertest.fragment.SettingFragment"/>
</LinearLayout>

SettingFragment类

package com.vocus.playertest.fragment

import android.os.Bundle
import android.preference.Preference
import android.preference.PreferenceFragment
import android.preference.PreferenceScreen
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.vocus.playertest.R
import org.jetbrains.anko.toast class SettingFragment :PreferenceFragment(){
override fun onCreateView(
inflater: LayoutInflater?,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
addPreferencesFromResource(R.xml.fragment_setting)
return super.onCreateView(inflater, container, savedInstanceState)
} override fun onPreferenceTreeClick(
preferenceScreen: PreferenceScreen?,
preference: Preference?
): Boolean {
val key=preference?.key
when(key){
"about"->toast("点击了关于")
}
return true
}
}

xml/fragment_setting.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:key="clear_cache"
android:title="清除缓存"/>
<SwitchPreference
android:key="push"
android:title="推送文章"/>
<SwitchPreference
android:key="no_wifi"
android:title="非wifi环境加载图片"/>
<Preference
android:key="about"
android:title="关于"/>
</PreferenceScreen>

判断SwitchPreference是否选中

在SettingActivity.kt中添加代码

        val ps= PreferenceManager.getDefaultSharedPreferences(this)
val push=ps.getBoolean("push",false)
println("push=$push")

效果1

加载网络数据

参考

其他控件

ListView

代码清单

MyListAdapter.kt
class MyListAdpter:BaseAdapter() {
override fun getItem(p0: Int): Any {
return 0
} override fun getItemId(p0: Int): Long {
return 0
} override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var myListView=LayoutInflater.from(parent!!.context).inflate(R.layout.listview_item,parent,false) return myListView
} override fun getCount(): Int {
return 20
}
}

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) lv_1.adapter=MyListAdpter()
lv_1.setOnItemClickListener(object:AdapterView.OnItemClickListener{
override fun onItemClick(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
Toast.makeText(getApplicationContext(),"haha"+p2,Toast.LENGTH_SHORT).show()
} })
}
}

效果

GridView

代码清单

MyGridViewAdapter.kt

class MyGridViewAdapter :BaseAdapter(){
override fun getView(position: Int, view: View?, parent: ViewGroup?): View {
//
val myGridView=LayoutInflater.from(parent!!.context).inflate(R.layout.my_gridview_item,parent,false)
var myImageView=myGridView.findViewById<ImageView>(R.id.gvItemImage)
var myTextView=myGridView.findViewById<TextView>(R.id.gvItemText)
myTextView.text="flower"
myTextView.textSize=20f
myTextView.setTextColor(Color.GRAY)
myImageView.setImageResource(R.drawable.sunflower)
myGridView.setTag(myImageView)
myGridView.setTag(myTextView)
return myGridView
} override fun getItem(p0: Int): Any {
return 0
} override fun getItemId(p0: Int): Long {
return 0
} override fun getCount(): Int {
return 10
}

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) myGirdView.adapter=MyGridViewAdapter() }
}

效果

RecyclerView

准备工作:打开工程结构,依次选择依赖,app,添加依赖项,搜索recyclerview,导入recyclerview

LinearLayoutManager

代码清单

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
myRcyView.layoutManager=LinearLayoutManager(this)
myRcyView.addItemDecoration(MyItemDecoration())
//myRcyView.addOnItemTouchListener()
myRcyView.adapter=RcyAdapter() } //设置分割线
class MyItemDecoration:RecyclerView.ItemDecoration(){
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
outRect.set(0,0,0,parent.context.resources.getDimensionPixelOffset(R.dimen.dividerHeight))
}
}
}

RcyAdapter.kt

class RcyAdapter(): RecyclerView.Adapter<RecyclerView.ViewHolder>(){
private var mContext:Context?=null
//两个构造函数
constructor(context: Context):this(){
this.mContext=context
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return myViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.rcyview_item,parent,false)) } override fun getItemCount(): Int {
return 20
} override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
var textView=holder.itemView.findViewById<TextView>(R.id.rcyItemText)
textView.text="hello world"
textView.setTextColor(Color.GRAY)
textView.textSize=20f
holder.itemView.setTag(textView)
holder.itemView.setOnClickListener{
println("haha${position}")
//Toast.makeText(mContext,"haha"+position,Toast.LENGTH_SHORT).show()
Toast.makeText(holder.itemView.context,"haha"+position,Toast.LENGTH_SHORT).show()
}
} class myViewHolder(itemView: View) :RecyclerView.ViewHolder(itemView){
//var text1=itemView.findViewById<TextView>(R.id.rcyItemText)
} }

效果


WebView

简单测试

    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_newdetailinfo)
wv_1.loadUrl("https://www.baidu.com")
val webViewClient=WebViewClient()
wv_1.webViewClient=webViewClient
} override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if(keyCode==event!!.keyCode){
if(wv_1.canGoBack())
{
wv_1.goBack()
}
}
return super.onKeyDown(keyCode, event)
}

记得添加网络访问权限

关于WebViewClient和WebChromeClient可以参考Android WebView之WebViewClient和WebChromeClient

loadUrl方法,可传入外部url地址,也可以传入本地文件。本地文件的创建方法,在main文件夹下新建assets folder文件夹,创建test.html。引用方式"file:///android_asset/test.html

loadDataWithBaseURL,比如

//wv_1.loadDataWithBaseURL("https://img2018.cnblogs.com","<img src='/blog/1744377/202003/1744377-20200301213343563-1555470645.jpg'/>","text/html","utf-8",null);
wv_1.loadDataWithBaseURL("","<img src='https://img2018.cnblogs.com/blog/1744377/202003/1744377-20200301213343563-1555470645.jpg'/>","text/html","utf-8",null);

这篇文章讲得很详细了WebView全面解析

最新文章

  1. ES6新特性:Proxy代理器
  2. MySQL 多实例启动和关闭脚本
  3. 从 C++ 到 Qt(命令行编译)good
  4. TCP/IP协议原理与应用笔记16:交换机和路由器区别
  5. Delphi结构中使用String时遇到的内存泄露问题(没有利用String的引用计数自动销毁字符串的功能)
  6. Kinect的学习笔记发展(一)Kinect引进和应用
  7. kettle 4.4源代码分析Transformation
  8. 为什么MOBA、“吃鸡”游戏不推荐用tcp协议——实测数据
  9. springboot AOP全局拦截日志记录
  10. 如何在JSP中获得Cookie对象
  11. 帝国CMS系统标签e:loop调用的附加SQL条件和排序参数
  12. 环境部署(四):Linux下查看JDK安装路径
  13. [leetcode-108,109] 将有序数组转换为二叉搜索树
  14. 使用 Immutable Subject 来驱动 Angular 应用
  15. Flask在Pycharm开启调试模式
  16. mysql中的几种join 及 full join问题
  17. 如何提高JavaScript代码质量
  18. mysql5.7半自动同步设置【转】
  19. hdu 4055 Number String
  20. hdu 1025:Constructing Roads In JGShining&#39;s Kingdom(DP + 二分优化)

热门文章

  1. 如何创建一个Asp .Net Web Api项目
  2. 剑指offer - 栈的压入弹出序列 - JavaScript
  3. JAVA - SpringBoot项目引用generator生成 Mybatis文件
  4. 干货分享:想要写好Proposal,这四个问题必须解决
  5. hdu 2583 How far away ? 离线算法 带权求最近距离
  6. UVA - 294 Divisors (约数)(数论)
  7. 洛谷 P5542 [USACO19FEB]Painting The Barn
  8. ssi引用路径规则
  9. cf 453A.Little Pony and Expected Maximum
  10. python实现微信发送服务器监控报警消息代码实现