布局基础<kotlin>(整理自网络)
全屏
主界面
底部导航,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全面解析
布局基础<kotlin>(整理自网络)的更多相关文章
- 布局基础<kotlin>2,自定义控件(整理自网络)
引导页 传送门 Android vector标签 PathData 画图 ViewPager 代码清单 activity_main.xml <?xml version="1.0&quo ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- 【OGG】OGG基础知识整理
[OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...
- HTML&&CSS基础知识点整理
HTML&&CSS基础知识点整理 一.WEB标准:一系列标准的集合 1. 结构(Structure):html 语言:XHTML[可扩展超文本标识语言]和XML[可扩展标记语言] 2. ...
- Java基础 随笔整理
Java基础随笔整理 为了方便阅读,特整理了相关的学习笔记 Java感想 操千曲而后晓声 Java入门 Java其他 Java虚拟机详解 语言入门百题 Java开发工具 · Eclipse Java语 ...
- Linux常用基础命令整理:关机命令、查看目录下文件命令等
Linux常用基础命令整理:关机命令.查看目录下文件命令等 整理了一些Linux常用基础命令,欢迎指正. 首先记住四个热键,学会这四个键,收益一辈子. Tab按键---命令补齐功能Ctrl+c按键-- ...
- 一个简单的3D范例,是在别人基础上面整理的。
一个简单的范例,是在别人基础上面整理的.原来的例子,框图太乱了,没有条理感. http://pan.baidu.com/s/1eQTyGCE
- 第三模块:面向对象&网络编程基础 第2章 网络编程
01-计算机基础 02-什么是网络 03-五层协议详解 04-传输层详解 05-什么是Socket 06-基于socket实现简单套接字通信 07-在简单套接字基础上加上通信循环 08-客户端与服务端 ...
随机推荐
- Web基础之Spring AOP与事务
Spring之AOP AOP 全程Aspect Oriented Programming,直译就是面向切面编程.和POP.OOP相似,它也是一种编程思想.OOP强调的是封装.继承.多态,也就是功能的模 ...
- 如何用naviecat批量创建mysql数据
1.参考博文:https://blog.csdn.net/lelly52800/article/details/87267096 2.excel要与表结构一致 3.右键,导入向导,选择相应版本,点击“ ...
- CPU与内存
一.存储单元内存有被划分为若干个存储单元,每个存储单元可存放1一个字节,即8个二进制位.因此内存的最小寻址单位是以字节进行的,每个存储单元都有一个编号.比如1GB的内存,可以储存1024*1024*1 ...
- CGridCtrl只点击规定行中的按钮才弹出对话框
在头文件中添加: afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult); 添加映射:ON_NOTIFY(NM_CLICK, IDC_CUSTOM1 ...
- springcloud--zuul(过滤器)
在zuul添加过滤器 新建类继承ZuulFilter类. public class MyFilter extends ZuulFilter{ //是否需要过滤 @Override public boo ...
- 洛谷 P3133 [USACO16JAN]Radio Contact G
题目传送门 解题思路: f[i][j]表示FJ走了i步,Bessie走了j步的最小消耗值.方程比较好推. 横纵坐标要搞清楚,因为这东西WA了半小时. AC代码: #include<iostrea ...
- Centos6 import tensorflow遇到的问题
1.ImportError: /lib64/libc.so.6: version `GLIBC_2.16' not found 解决办法:升级系统glibc库至2.17版本 首先在网上下载glibc- ...
- 七十九、SAP中数据库操作之更新数据,UPDATE的用法
一.我们查看SFLIGHT数据库,比如我们需要改这条数据 二.代码如下 三.执行效果如下,显示“数据更新成功” 四.我们来看一下SFLIGHT数据库,发现已经由DEM更改为了AAA了
- 一、REACT概述
1.前端/react概述 <从零react> 1.前端工 程概述 Web跨平台.跨浏览 器的应用开发场景 网页浏览器(Web Browser) 通过 CLI 指令去操作的 Headless ...
- POJ 3461:Oulipo
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28155 Accepted: 11251 Descript ...