布局基础<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全面解析

浙公网安备 33010602011771号