布局基础<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" />
View Code

创建布局文件

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>
View Code

(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() {
    }


}
View Code

创建四个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)
    }
}
View Code

创建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
    }

}
View Code

设置监听

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

顶部<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>
View Code

创建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
            }
        })
    }
}
View Code

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()
    }
}
View Code

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>
View Code

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>
View Code

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
    }
}
View Code

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>
View Code

判断SwitchPreference是否选中

在SettingActivity.kt中添加代码

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

效果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
    }
}
View Code

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()
            }

        })
    }
}
View Code

效果

 

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
    }
View Code

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        myGirdView.adapter=MyGridViewAdapter()

    }
}
View Code

效果

 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))
        }
    }
}
View Code

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)
    }

}
View Code

效果


 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)
    }
View Code

记得添加网络访问权限

关于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全面解析

posted @ 2020-02-03 09:28  vocus  阅读(864)  评论(0)    收藏  举报