天天看點

實習筆記之個人設定界面

這是實習第一周的幾天所做的事情,主要内容包括:

  1. 切圖
  2. 幾種基本控件的使用
  3. 主要實作功能:修改密碼,個人資料(頭像選擇,修改昵稱,性别選擇),關于我們

聲明:所有代碼基于kotlin和databinding。

首先是設定界面的跳轉:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        if (item.itemId == R.id.menu_setting) {
            SettingActivity.startActivity(this@EtripMainActivity)
            return true
        } else {
            return super.onOptionsItemSelected(item)
        }
    }
           

重寫上述兩個方法,在首頁面中增加菜單欄并設定跳轉圖示和邏輯,跳轉到

SettingActivity

中。

SettingActivity

的界面如下:

實習筆記之個人設定界面

代碼如下:

package com.radella.etrip.ui.setting

import android.content.Context
import android.content.Intent
import android.databinding.DataBindingUtil
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import com.radella.etrip.R
import com.radella.etrip.base.BaseNormalActivity
import com.radella.etrip.databinding.ActivitySetting1Binding
import com.radella.etrip.ui.main.EtripMainActivity

class SettingActivity : BaseNormalActivity(),View.OnClickListener {
    override fun onClick(v: View?) {//各控件的點選事件,分别進入不同頁面中
        val text: TextView? = v?.findViewById(R.id.text) as TextView?
        when(text?.text)
        {
            "個人資料" -> {
                PersonalDataActivity.startActivity([email protected])
            }
            "修改密碼" -> {
                ModifyPwdActivity.startActivity([email protected])
            }
            "關于我們" ->
            {
                AboutUsActivity.startActivity([email protected])
            }

        }
    }

    lateinit var settingBinding: ActivitySetting1Binding
    var strings:Strings?=null
    override fun daggerInject() {
    }

    override fun initialize() {//初始化界面的資料,通過databinding綁定到xml檔案,然後注冊點選事件
        strings=Strings("個人資料","")
        settingBinding.personalData=strings
        strings=Strings("修改密碼","")
        settingBinding.changePwd=strings
        strings=Strings("關于我們","")
        settingBinding.aboutUs=strings
        var item1:LinearLayout?= findViewById(R.id.item1) as LinearLayout?
        item1?.setOnClickListener([email protected])
        var item2:LinearLayout?= findViewById(R.id.item2) as LinearLayout?
        item2?.setOnClickListener([email protected])
        var item3:LinearLayout?= findViewById(R.id.item3) as LinearLayout?
        item3?.setOnClickListener([email protected])
        var returnEtripMain:Button= findViewById(R.id.setting_return_EtripMain) as Button
        returnEtripMain.setOnClickListener(View.OnClickListener {
            EtripMainActivity.startActivity([email protected])
            finish() })



    }

    override fun loadViewLayout() {//databinding綁定到xml中
        settingBinding = DataBindingUtil.inflate(layoutInflater, R.layout.activity_setting1,binding.llContainer,true)    }

    companion object{//在其他activity中調用該方法啟動本activity
        fun startActivity(context: Context){
            val intent = Intent()
            intent.setClass(context,SettingActivity::class.java)
            context.startActivity(intent)
        }
    }
}
           

以及

SettingActivity

的xml布局

R.layout.activity_setting1

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/tools">
    <data>
        <variable
            name="personal_data"
            type="com.radella.etrip.ui.setting.Strings"/>
        <variable
            name="change_pwd"
            type="com.radella.etrip.ui.setting.Strings"/>
        <variable
            name="about_us"
            type="com.radella.etrip.ui.setting.Strings"/>
    </data>
    <LinearLayout
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_marginStart="20dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="設定"
                android:layout_marginTop="102dp"
                android:textSize="26sp"
                />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_marginTop="20dp"
                android:background="@color/black_alpha_10" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:id="@+id/item1">

                <include
                    layout="@layout/line_with_text"
                    bind:viewModel="@{personal_data}" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:id="@+id/item2">

                <include
                    layout="@layout/line_with_text"
                    bind:viewModel="@{change_pwd}" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:id="@+id/item3">

                <include
                    layout="@layout/line_with_text"
                    bind:viewModel="@{about_us}" />
            </LinearLayout>
        </LinearLayout>
        <Button
            android:id="@+id/setting_return_EtripMain"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="40dp"
            android:layout_marginEnd="40dp"
            android:layout_marginTop="16dp"
            android:text="登出"
            android:textSize="16sp"
            android:textColor="@color/white"
            android:layout_gravity="center_vertical"
            android:backgroundTint="@color/colorPrimary"/>
    </LinearLayout>
</layout>
           

這裡有幾點要注意:

  1. databinding與include标簽的結合,可以将目前xml布局的資料傳輸到include的布局中
  2. 設定Button的背景

    backgroundTint

    ,效果好于

    background

    ,有圓角

PersonalDataActivity

個人資料界面

實習筆記之個人設定界面

代碼部分:

package com.radella.etrip.ui.setting

import android.Manifest
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.pm.PackageManager
import android.databinding.DataBindingUtil
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Bundle
import android.os.Environment
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.support.v7.app.AlertDialog
import android.util.Log
import android.view.Gravity
import android.view.KeyEvent
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.PopupWindow
import android.widget.TextView
import com.radella.etrip.R
import com.radella.etrip.base.BaseNormalActivity
import com.radella.etrip.databinding.ActivityPersonalDataBinding
import com.sw926.imagefileselector.ErrorResult
import com.sw926.imagefileselector.ImageFileSelector


class PersonalDataActivity : BaseNormalActivity(),View.OnClickListener {
    lateinit var personalDataBinding: ActivityPersonalDataBinding
    lateinit var imageSelector: ImageFileSelector
    var popupWindow:PopupWindow?=null
    override fun onClick(v: View?) {
        if (v?.id==R.id.head_icon)//點選頭像,彈出popwindow
        {
            val current_view=layoutInflater.inflate(R.layout.activity_personal_data,null)
            val view = layoutInflater.inflate(R.layout.head_icon_choose, null)
            val windowManager = windowManager
            val width = windowManager.defaultDisplay.width
            val heigth = windowManager.defaultDisplay.height
            Log.i("width", width.toString() + "")
            Log.i("height", heigth.toString() + "")
            popupWindow = PopupWindow(view, width.toInt(), heigth.toInt())
            popupWindow?.animationStyle=R.style.anim_menu_bottom_bar//設定彈出動畫
            popupWindow?.isFocusable = true
            popupWindow?.isTouchable=true
            popupWindow?.isOutsideTouchable = true
            view.isFocusable=true
            view.isFocusableInTouchMode=true
            view.setOnKeyListener(object :View.OnKeyListener{//設定點選傳回鍵的事件,令popwindow消失
                override fun onKey(v: View?, keyCode: Int, event: KeyEvent?): Boolean {
                    if (keyCode==KeyEvent.KEYCODE_BACK)
                    {
                        if (popupWindow?.isShowing!!)
                        {
                            popupWindow?.dismiss()
                        }
                    }
                    return false
                }

            }


            )
//            popupWindow?.setBackgroundDrawable(PaintDrawable())
            //顯示在螢幕中央
            popupWindow?.showAtLocation(current_view, Gravity.CENTER, , )
            val close_icon:ImageView= view.findViewById(R.id.close_icon) as ImageView
            close_icon.setOnClickListener(View.OnClickListener {popupWindow?.dismiss()})
            val take_picture:ImageView= view.findViewById(R.id.take_picture) as ImageView
            take_picture.setOnClickListener(View.OnClickListener {
                popupWindow?.dismiss()
                imageSelector.takePhoto([email protected],) })
            val photo_album:ImageView= view.findViewById(R.id.photo_album) as ImageView
            photo_album.setOnClickListener(View.OnClickListener {
                popupWindow?.dismiss()
                imageSelector.selectImage([email protected],) })
            return
        }
        val text: TextView? = v?.findViewById(R.id.text) as TextView?
        when(text?.text)
        {

            "昵稱" ->
            {
                var intent:Intent=Intent([email protected],ModifyNicknameActivity::class.java)
                intent.putExtra("nickname",personalDataBinding.text2.data)
                startActivityForResult(intent,)
            }
            "性别" ->{
                val choiceonclicklistener=ChoiceOnClickListener()
                val sex:String?=personalDataBinding.text3.data
                val sexInt=if (sex=="女") else 
                val sexDialog:Dialog=AlertDialog.Builder([email protected])
                        .setTitle("選擇性别")
                        .setSingleChoiceItems(R.array.sex,sexInt,choiceonclicklistener)
                        .setPositiveButton("确定", DialogInterface.OnClickListener { dialog, which ->
                                if (choiceonclicklistener.which==)
                                {
                                    var strings=Strings("性别","男")
                                    personalDataBinding.text3=strings
                                }
                                else
                                {
                                    var strings=Strings("性别","女")
                                    personalDataBinding.text3=strings
                                }
                        })
                        .create()
                sexDialog.show()
            }
        }
    }


    override fun loadViewLayout() {
        personalDataBinding=DataBindingUtil.inflate(layoutInflater, R.layout.activity_personal_data,binding.llContainer,true)

    }

    override fun daggerInject() {
    }

    override fun initialize() {
        val str="頭像"
        personalDataBinding.text1=str
        var strings=Strings("昵稱","周吉")
        personalDataBinding.text2=strings
        strings=Strings("性别","女")
        personalDataBinding.text3=strings
//        strings=Strings("地區","北京")
//        personalDataBinding.text4=strings
        var item1:ImageView=findViewById(R.id.head_icon) as ImageView
        item1.setOnClickListener([email protected])
        var item2:LinearLayout= findViewById(R.id.personal_data_item2) as LinearLayout
        item2.setOnClickListener([email protected])
        var item3:LinearLayout= findViewById(R.id.personal_data_item3) as LinearLayout
        item3.setOnClickListener([email protected])
        imageSelector = ImageFileSelector([email protected])
        imageSelector.setOutPutPath(Environment.getExternalStorageDirectory().toString() + "/tencent/QQfile_recv/")
        Log.v("FILEPATH1",Environment.getExternalStorageDirectory().toString() + "/tencent/QQfile_recv/")
        // 設定輸出檔案的尺寸
        imageSelector.setOutPutImageSize(, )
        // 設定儲存圖檔的品質 到
        imageSelector.setQuality()
        imageSelector.setCallback(object : ImageFileSelector.Callback {
            override fun onSuccess(file: String) {
                // 選取圖檔成功
                Log.v("FILEPATH2",file)
//                val head_icon_layout=layoutInflater.inflate(R.layout.line_with_image,null)
                val head_icon_layout: View? =findViewById(R.id.head_icon)
                val head_icon_image:ImageView?= head_icon_layout?.findViewById(R.id.head_icon) as ImageView?
                if (head_icon_image==null)
                {
                    Log.v("HEADICON","NULL")
                }
                else
                {
                    val image:Bitmap?= BitmapFactory.decodeFile(file)
                    head_icon_image?.setImageBitmap(image)
                    head_icon_image.scaleType=ImageView.ScaleType.CENTER_CROP
                }

            }

            override fun onError(errorResult: ErrorResult?) {
                when(errorResult){
                }
            }
        })
        checkPermissionPic()
    }
    /**
     * 檢查讀取相冊的權限
     */
    fun checkPermissionPic(){
        if( ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED ){
        }else {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE) && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE), );

            } else {
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE), );
            }
        }
    }
    //點選儲存退到設定界面
    fun clickReturnSetting(view: View){
        finish()
    }
    companion object{
        fun startActivity(context: Context){
            val intent = Intent()
            intent.setClass(context,PersonalDataActivity::class.java)
            context.startActivity(intent)
        }
    }
    class ChoiceOnClickListener:DialogInterface.OnClickListener{
        var which:Int=
        override fun onClick(dialog: DialogInterface?, which: Int) {
            this.which=which

        }


    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode==&&resultCode==)
        {
            var bundle:Bundle?=data?.getBundleExtra("nickname")
            var strings=Strings("昵稱", bundle!!["nickname"] as String?)
            personalDataBinding.text2=strings

        }
        imageSelector.onActivityResult([email protected],requestCode,resultCode,data)
    }

        override fun onSaveInstanceState(outState: Bundle?) {
        super.onSaveInstanceState(outState)
        imageSelector.onSaveInstanceState(outState)
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
        super.onRestoreInstanceState(savedInstanceState)
        imageSelector.onRestoreInstanceState(savedInstanceState)
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        if (requestCode == ){
            if (grantResults.size ==  && grantResults[] == PackageManager.PERMISSION_GRANTED && grantResults[] == PackageManager.PERMISSION_GRANTED) {
                //授權成功
            } else {
                //授權失敗
            }
        }
        else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults)
            imageSelector.onRequestPermissionsResult([email protected],requestCode, permissions, grantResults)
        }
    }
}
           

這個個人資料的界面代碼是耗時最多的部分,幹了三件事:

  1. 選擇頭像
  2. 修改昵稱
  3. 選擇性别

分别細說:

1.選擇頭像。

核心:popwindow、imageSelector的使用、權限申請和檢查,popwindow用于在點選頭像時彈出半透明的選擇方式界面,注意界面本身和界面外部的屬性設定即可。

imageSelector的使用:

imageSelector = ImageFileSelector([email protected])     imageSelector.setOutPutPath(Environment.getExternalStorageDirectory().toString() + "/tencent/QQfile_recv/")
        // 設定輸出檔案的尺寸
        imageSelector.setOutPutImageSize(, )
        // 設定儲存圖檔的品質 到
        imageSelector.setQuality()
        imageSelector.setCallback(object : ImageFileSelector.Callback {
            override fun onSuccess(file: String) {
                // 選取圖檔成功
                Log.v("FILEPATH2",file)
//                val head_icon_layout=layoutInflater.inflate(R.layout.line_with_image,null)
                val head_icon_layout: View? =findViewById(R.id.head_icon)
                val head_icon_image:ImageView?= head_icon_layout?.findViewById(R.id.head_icon) as ImageView?
                if (head_icon_image==null)
                {
                    Log.v("HEADICON","NULL")
                }
                else
                {
                    val image:Bitmap?= BitmapFactory.decodeFile(file)
                    head_icon_image?.setImageBitmap(image)
                    head_icon_image.scaleType=ImageView.ScaleType.CENTER_CROP
                }

            }

            override fun onError(errorResult: ErrorResult?) {
                when(errorResult){
                }
            }
        })
    }
           

當選取圖檔成功後會調用onSuccess方法

其次要在

onSaveInstanceState、 onRestoreInstanceState、 onRequestPermissionsResult

方法最後分别加上

imageSelector.onSaveInstanceState(outState)、 imageSelector.onRestoreInstanceState(savedInstanceState)、 imageSelector.onRequestPermissionsResult([email protected],requestCode, permissions, grantResults)

關于權限方面其實百度就行,代碼中也有了

xml檔案如下:

activity_personal_data

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/tools">
    <data>
        <variable
            name="text1"
            type="String"/>
        <variable
            name="text2"
            type="com.radella.etrip.ui.setting.Strings"/>
        <variable
            name="text3"
            type="com.radella.etrip.ui.setting.Strings"/>
        <!--<variable-->
            <!--name="text4"-->
            <!--type="com.radella.etrip.ui.setting.Strings"/>-->
    </data>
    <LinearLayout
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_marginStart="20dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="個人資料"
                android:layout_marginTop="102dp"
                android:textSize="26sp"
                />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:layout_marginTop="18dp">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:id="@+id/personal_data_item1">
                    <include
                        layout="@layout/line_with_image"
                        bind:text="@{text1}"
                        android:id="@+id/head_icon_layout"
                        />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:id="@+id/personal_data_item2">
                    <include
                        layout="@layout/line_with_text"
                        bind:viewModel="@{text2}"/>
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:id="@+id/personal_data_item3">
                    <include
                        layout="@layout/line_with_text"
                        bind:viewModel="@{text3}"/>
                </LinearLayout>

                <!--<include-->
                    <!--layout="@layout/line_with_text"-->
                    <!--bind:viewModel="@{text4}"/>-->
            </LinearLayout>


        </LinearLayout>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="76dp"
            android:layout_marginEnd="76dp"
            android:layout_marginTop="32dp"
            android:text="儲存"
            android:textColor="@color/white"
            android:backgroundTint="@color/colorPrimary"
            android:textSize="16sp"
            android:layout_gravity="center_vertical"
            android:onClick="clickReturnSetting"
            />


    </LinearLayout>
</layout>
           

2.修改昵稱

ModifyNicknameActivity

實習筆記之個人設定界面
package com.radella.etrip.ui.setting

import android.content.Context
import android.content.Intent
import android.databinding.DataBindingUtil
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import com.radella.etrip.R
import com.radella.etrip.base.BaseNormalActivity
import com.radella.etrip.dagger.ActivityModule
import com.radella.etrip.dagger.DaggerAppComponent
import com.radella.etrip.databinding.ActivityModifyNicknameBinding
import com.radella.etrip.viewmodle.setting.ModifyNameViewModel
import javax.inject.Inject

class ModifyNicknameActivity : BaseNormalActivity(),View.OnClickListener {
    lateinit var modifyNicknameBinding: ActivityModifyNicknameBinding
    @Inject lateinit var viewModel: ModifyNameViewModel
    override fun loadViewLayout() {
       modifyNicknameBinding=DataBindingUtil.inflate(layoutInflater, R.layout.activity_modify_nickname,binding.llContainer,true)
    }

    override fun daggerInject() {
        DaggerAppComponent
                .builder().activityModule(ActivityModule([email protected]))
                .build()
                .inject(this)
    }

    override fun initialize() {
        modifyNicknameBinding.viewModel = viewModel
        oldnickname=intent.getStringExtra("nickname")
        modifyNicknameBinding.viewModel.edit_text.set(oldnickname)
        //擷取原昵稱
        if (oldnickname?.isNotEmpty()!!)
        {
            modifyNicknameBinding.viewModel.save_color.set(resources.getColor(R.color.colorPrimary))
            modifyNicknameBinding.viewModel.saveEnabled.set(true)
            //當編輯框不為空時令儲存按鈕可點選
        }
        else
        {
        //否則不可點選            modifyNicknameBinding.viewModel.save_color.set(resources.getColor(R.color.qupai_gray_0xd4))
            modifyNicknameBinding.viewModel.saveEnabled.set(false)
        }

    }

    var oldnickname:String?=null
    override fun onClick(v: View?) {
        val edit_nickname:String=modifyNicknameBinding.viewModel.edit_text.get()
        var bundle:Bundle=Bundle()
        bundle.putString("nickname", edit_nickname)
        Log.v("edit_nickname",edit_nickname)
        intent.putExtra("nickname",bundle)
        setResult(,intent)
//        PersonalDataActivity.startActivity([email protected])
        finish()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        var saveButton: Button = findViewById(R.id.modify_nickname_save) as Button
        saveButton.setOnClickListener([email protected])
//        oldnickname=intent.getStringExtra("nickname")
//        var edit_nickname:MaterialEditText= findViewById(R.id.edit_nickname) as MaterialEditText
//        edit_nickname.setText(oldnickname)

    }
    companion object{
        fun startActivity(context: Context){
            val intent = Intent()
            intent.setClass(context,ModifyNicknameActivity::class.java)
            context.startActivity(intent)
        }
    }

}

           

xml檔案:

activity_modify_nickname

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="viewModel"
            type="com.radella.etrip.viewmodle.setting.ModifyNameViewModel"/>
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_marginStart="20dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="102dp"
                android:text="修改昵稱"
                android:textSize="26sp"/>
            <TextView
                style="@style/text_20_black"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:text="可使用中英文、數字和下劃線,字數限制1-10個字"
                android:textSize="12sp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="68dp"
                android:text="輸入昵稱"
                android:textSize="12sp"/>
            <com.rengwuxian.materialedittext.MaterialEditText
                android:id="@+id/edit_nickname"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="18sp"
                android:maxLength="10"
                android:text="@{viewModel.edit_text.get()}"
                app:onTextChangedCommand="@{viewModel.textChangeCommand}"
                />
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="48dp"
                android:backgroundTint="@{viewModel.save_color.get()}"
                android:text="儲存"
                android:textSize="16sp"
                android:textColor="#fff"
                android:layout_marginStart="40dp"
                android:layout_marginEnd="40dp"
                android:layout_gravity="center_horizontal"
                android:enabled="@{viewModel.saveEnabled.get()}"
                android:id="@+id/modify_nickname_save"/>
        </LinearLayout>
    </LinearLayout>
</layout>
           

1.

<com.rengwuxian.materialedittext.MaterialEditText android:id="@+id/edit_nickname" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:maxLength="10" android:text="@{viewModel.edit_text.get()}" app:onTextChangedCommand="@{viewModel.textChangeCommand}" />

設定最長字數用maxlength

2.該頁面的viewmodel

package com.radella.etrip.viewmodle.setting

import android.app.Activity
import android.databinding.ObservableBoolean
import android.databinding.ObservableField
import android.databinding.ObservableInt
import android.util.Log
import com.kelin.mvvmlight.base.ViewModel
import com.kelin.mvvmlight.bindingadapter.edittext.ViewBindingAdapter
import com.kelin.mvvmlight.command.ReplyCommand
import com.radella.etrip.R
import rx.functions.Action0
import java.util.*
import javax.inject.Inject

/**
 * Created by 鄧蘇桃 on 2017/7/21.
 */
class ModifyNameViewModel @Inject internal constructor():ViewModel{
    @Inject lateinit var context: Activity
    var saveEnabled= ObservableBoolean()
    var edit_text=ObservableField<String>()
    var save_color=ObservableInt()
    var textChangeCommand=ReplyCommand<ViewBindingAdapter.TextChangeDataWrapper>(){
        t ->

        Log.v("edit_text1",edit_text.get())
        if (t.s.isNotEmpty())
        {
            saveEnabled.set(true)
            save_color.set(context.resources.getColor(R.color.colorPrimary))

        }
        else
        {
            saveEnabled.set(false)
            save_color.set(context.resources.getColor(R.color.qupai_gray_0xd4))
        }
        edit_text.set(t.s.toString())
        Log.v("edit_text2",edit_text.get())
    }
}
           

使用了ReplyCommand,其類型需要查詢文檔。

set_color應該這樣設定:

save_color.set(context.resources.getColor(R.color.colorPrimary))
           

而不是直接寫

R.color.colorPrimary

3.選擇性别

實習筆記之個人設定界面

就是一個簡單的Dialog建立,實作

DialogInterface.OnClickListener

接口以記錄點選的位置(which)

其他兩個界面比較簡單,修改密碼調下界面即可,關于我們的圖要用ScaleType:centercrop來充滿整個頁面。

繼續閱讀