如何在Kotlin的xml标记中自动添加相同的xml代码?

时间:2018-10-22 10:37:04

标签: android xml kotlin xml-parsing custom-controls

我想在我的xml文件中自动添加以下xml代码,即TextView标签,该怎么办?

我要在打开标签后添加的

代码是:

com.mycompany.projectname.

我要在上面的代码中插入的标签是:

<TextView
    android:id="@+id/textView16"
    android:layout_width="wrap_content"
/>

我的预期输出如下

<com.mycompany.projectname.TextView
android:id="@+id/textView16"
android:layout_width="wrap_content"
 />

2 个答案:

答案 0 :(得分:0)

自定义小部件android studio不会自动以XML格式添加/添加。 您必须使用包手动给您的班级名称。

在预定义小部件中,如果要添加一些属性,请按

  

Ctrl + Windows空格

     

Mac的Command +空格

答案 1 :(得分:0)

您无法在运行时修改资源文件(包括xml布局)。

不过,您可以在Context中安装自定义LayoutInflater.Factory2来修改XML解析行为。下面的示例(请注意,我正在使用Kotlin扩展):

activity_style.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/txtTest"
        android:layout_gravity="center"
        android:text="Hello world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btnTest"
        android:text="Test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

sample.kt

import android.content.Context
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.app.AppCompatDelegate
import android.support.v7.widget.AppCompatTextView
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import com.github.ppaszkiewicz.testvhpayload.R
import kotlinx.android.synthetic.main.activity_style.*

class StyleActivity : AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        // replace default factory with a wrapper - must be called before onCreate
        layoutInflater.factory = MyTextViewFactory(delegate)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_style)
        Log.d("TEST","TextView is ${txtTest::class.simpleName}")
        Log.d("TEST","Button is ${btnTest::class.simpleName}")
    }
}

class MyTextViewFactory(val appCompatDelegate: AppCompatDelegate) : LayoutInflater.Factory2{
    override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? {
        if(name == "TextView")
            return MyTextView(context, attrs)  // custom behaviour for TextViews
        return appCompatDelegate.createView(parent, name, context, attrs) // default appcompat views
    }

    override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? {
        return onCreateView(null, name, context, attrs)
    }
}

class MyTextView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr)

运行日志后应显示

TextView is MyTextView
Button is AppCompatButton