写到越后面, 渐渐失控
添加子类导航的点击事件
这是在 pagerview 中嵌套了 layout 布局. 三个子控件属于 layout 布局, 给它们添加点击事件, 直接用它们的控件 id 就好
但是如果在 homepagefragment 类中直接 id.setOnClickListener{} 就会报 Unable to start activity ComponentInfo{com.vocus.justtest/com.vocus.justtest.ui.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.vocus.justtest.view.ImageTextView 估计是上下文的问题吧
那就在 adapter 中去设置吧
- when (position%3) {
- 0 -> {
- var navView = LayoutInflater.from(container.context)
- .inflate(R.layout.fragment_home_nav_program, container, false)
- container.addView(navView)
- //
- var javaView=navView.findViewById<ImageTextView>(R.id.nav_item_java);
- javaView.setOnClickListener{
- Toast.makeText(container.context,"点击了", Toast.LENGTH_SHORT).show()
- }
- var kotlinView=navView.findViewById<ImageTextView>(R.id.nav_item_kotlin);
- kotlinView.setOnClickListener{
- Toast.makeText(container.context,"点击了", Toast.LENGTH_SHORT).show()
- }
- var cView=navView.findViewById<ImageTextView>(R.id.nav_item_c);
- cView.setOnClickListener{
- Toast.makeText(container.context,"点击了", Toast.LENGTH_SHORT).show()
- }
- return navView
- }
点击要跳转到新的页面, 与此同时还应该把点击了哪个 view 的标识传过去. 本来想把 view 的文本传过去, 但是有可能是中文, 就不太方便了, 还是传个位置过去吧, 比如
- var javaView=navView.findViewById<ImageTextView>(R.id.nav_item_java);
- var intent:Intent?=null;
- intent= Intent(container.context,NewsListActivity::class.java)
- javaView.setOnClickListener{
- intent.putExtra("position",0);
- container.context.startActivity(intent)
- }
子类导航的文章列表
布局是一个 toolbar 和一个 recyclerview
- <LinearLayout
- xmlns:Android="http://schemas.android.com/apk/res/android" Android:layout_width="match_parent"
- Android:layout_height="match_parent"
- Android:orientation="vertical">
- <include layout="@layout/toolbar"/>
- <androidx.recyclerview.widget.RecyclerView
- Android:id="@+id/rv_newslist"
- Android:layout_width="match_parent"
- Android:layout_height="wrap_content"
- Android:layout_marginTop="10dp"/>
- </LinearLayout>
toolbar 布局包括显示标题, 一个返回按钮和一个菜单
- <Toolbar
- Android:id="@+id/toolbar"
- xmlns:Android="http://schemas.android.com/apk/res/android"
- Android:layout_width="match_parent"
- Android:layout_height="wrap_content"
- Android:background="#3EA3C7"
- Android:navigationIcon="@drawable/ic_back2">
- <!-- #E56B6B-->
- <TextView
- Android:id="@+id/toolbar_title"
- Android:layout_width="wrap_content"
- Android:layout_height="wrap_content"
- Android:layout_gravity="center"
- Android:text="编程语言"
- Android:textSize="20dp"
- Android:textColor="#fff"/>
- </Toolbar>
toolbar 因为在别的地方也会用到, 所以建个管理接口 ToolbarManager
- interface ToolbarManager {
- val toolbar:Toolbar
- val activity:Activity
- fun initNavDetailToolbar(){
- toolbar.title=""
- toolbar.setTitleTextColor(Color.WHITE)
- toolbar.inflateMenu(R.menu.list)
- toolbar.setOnMenuItemClickListener(object :Toolbar.OnMenuItemClickListener{
- override fun onMenuItemClick(p0: MenuItem?): Boolean {
- when(p0?.itemId){
- //
- }
- return true
- }
- })
- toolbar.setNavigationOnClickListener(View.OnClickListener{
- activity.finish()
- } )
- // 高度设置
- var statusbarTool=StatusbarTool()
- var statusHeight=statusbarTool.getStatusbarHeight(activity)
- //(toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin=stateHeight
- toolbar.setPadding(0,statusHeight,0,0)
- }
菜单布局
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:Android="http://schemas.android.com/apk/res/android">
- <item
- Android:id="@+id/setting"
- Android:title="设置"
- Android:icon="@drawable/dot1"
- Android:showAsAction="always" />
- </menu>
NewsListActivity 中
- class NewsListActivity:BaseActivity() ,ToolbarManager{
- override val toolbar: Toolbar by lazy{
- findViewById<Toolbar>(R.id.toolbar)
- }
- override val activity:Activity=this
- override fun getLayoutId(): Int {
- return R.layout.newslist;
- }
- override fun initData() {
- initNavDetailToolbar()
- var statusbarTool=StatusbarTool()
- statusbarTool.makeStatusBarTransparent(this)
- //RecyclerView
- rv_newslist.layoutManager=LinearLayoutManager(baseContext)
- var adapter=NewsListAdapter()
- rv_newslist.adapter=adapter
- }
- }
statusbarTool 是我自己封装的关于状态栏的工具类, 包括获得状态栏高度, 设置状态栏透明. 关于状态栏, 第四篇有分析过
在设置 toolbar 的时候遇到的几个问题和解决办法
菜单图标不显示, 命名空间的问题, 我把 showAsAction 设置为 Android 前缀了. 参考 Android 4.3 menu item showAsAction="always" ignored
还有个问题也有必要处理一下的, 就是设置状态栏透明之后, toolbar 和状态栏重合了. 这个问题之前遇到过, 那我现在不考虑兼容的问题, 给 toolbar 设置一个状态栏高度的 padding
toolbar.setPadding(0,statusHeight,0,0)
RecyclerView 的话随便写个就好了. 最后静态的效果是这样的
还有一个问题, 点击右上角的菜单, 会弹出一个对话框
自定义一个 Dialog 就行. 因为需要让对话框去掉左右边距, 并且底部对齐, 所以样定义它的样式
- <style name="BottomUpDialog" parent="@android:style/Theme.Dialog">
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowBackground">@Android:color/transparent</item>
- </style>
似乎只有设置了 Android:windowBackground 为透明, 才能让它底部对齐. 一旦设置背景透明, dialog 里的控件如果使用 padding,padding 也会透明. 所以只好为控件设置固定高度了.
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
- Android:layout_width="match_parent"
- Android:layout_height="fill_parent"
- Android:orientation="vertical">
- <Button
- Android:layout_width="match_parent"
- Android:layout_height="40dp"
- Android:text="关注"
- Android:background="#ffffff"
- />
- <ImageView
- Android:layout_width="match_parent"
- Android:layout_height="0.5dp"
- Android:background="#D9D9D9"/>
- <Button
- Android:layout_width="match_parent"
- Android:layout_height="40dp"
- Android:text="取消"
- Android:background="#ffffff"
- />
- </LinearLayout>
Dialog 类
- class BottomUpDialog : Dialog {
- constructor(context: Context):super(context,R.style.BottomUpDialog)
- constructor(context: Context,themerResId:Int):super(context,themerResId)
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.dialog_bottomup)
- initView()
- }
- private fun initView() {
- // 宽度填充屏幕
- Windows?.decorView?.setPadding(0,0,0,0)
- // Windows?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT)
- var attr=Windows?.attributes
- attr?.width= WindowManager.LayoutParams.MATCH_PARENT;
- attr?.height= WindowManager.LayoutParams.WRAP_CONTENT;
- // 底部对齐
- attr?.gravity=Gravity.BOTTOM
- Windows?.attributes=attr
- // 底部对齐
- //Windows?.setGravity(Gravity.BOTTOM)
- }
- }
还有要设置一下边框的样式, 上面显示一个圆角表框
定义边框的样式
- <?xml version="1.0" encoding="utf-8"?>
- <layer-list xmlns:Android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid Android:color="#D9D9D9" />
- <corners Android:topLeftRadius="20dp"
- Android:topRightRadius="20dp"/>
- </shape>
- </item>
- <item Android:top="0.5dp">
- <shape>
- <solid Android:color="#ffffff" />
- <corners Android:topLeftRadius="10dp"
- Android:topRightRadius="10dp"/>
- </shape>
- </item>
- </layer-list>
参考: Android 中如何让控件只显示某一边框, 在第一个 textView 上使用这个边框样式
弹出对话框还要加个动画属性, 让显示的时候从下至上弹出, 隐藏的时候从下往上隐藏
定义两个动画资源, 然后这样引用就行
- <style name="BottomUpDialog" parent="@android:style/Theme.Dialog">
- <item name="android:windowNoTitle">true</item>
- <item name="android:windowBackground">@Android:color/transparent</item>
- <item name="android:windowAnimationStyle">@style/dialogAnim</item>
- </style>
- <style name="dialogAnim" parent="@android:style/Animation.Dialog">
- <item name="android:windowEnterAnimation">@anim/dialog_enter_anim</item>
- <item name="android:windowExitAnimation">@anim/dialog_exit_anim</item>
- </style>
然后就是响应 dialog 中按钮的点击事件
就设置一下按钮点击监听就好了
- dialog_follow.setOnClickListener {
- }
- dialog_cancel.setOnClickListener {
- dismiss()
- }
最后我还想做一个功能
从首页导航跳转到文章列表页, 根据选择的项目不同, 动态设置一下 toolbar 的标题和背景颜色
在 ToolBarManager 中定义一个函数
- fun setNavDetalToolbarStyle(title:String,color:Int){
- toolbar.setBackgroundColor(color)
- toolbar.toolbar_title.text=title
- }
然后在 NewsListActivity 初始化函数中执行函数..
如果 getStringExtra 为空, 参考 Android Kotlin intent.getStringExtra("xxx") 获取为 null 问题解决
- override fun initData() {
- initNavDetailToolbar()
- var pos:Int=intent.getStringExtra("posi").toInt()
- when(pos){
- 0->setNavDetalToolbarStyle("JAVA", Color.RED)
- 1->setNavDetalToolbarStyle("Kotlin",Color.GREEN)
- 2->setNavDetalToolbarStyle("C/C++",Color.BLUE)
- }
- //
- var statusbarTool=StatusbarTool()
- statusbarTool.makeStatusBarTransparent(this)
- //RecyclerView
- rv_newslist.layoutManager=LinearLayoutManager(baseContext)
- var adapter=NewsListAdapter()
- rv_newslist.adapter=adapter
- }
- }
暂时就这样吧, 我累.. 效果
还有 RecyclerView 上拉刷新下拉加载更多没做...
来源: http://www.bubuko.com/infodetail-3449154.html