как ссылаться на элемент из layer-list.xml в деятельности

#java #android-studio #kotlin #drawable #layer-list

#java #android-studio #kotlin #можно рисовать #слой-список

Вопрос:

Когда я пытаюсь запустить свое приложение, я получаю сообщение об ошибке «Попытка вызвать виртуальный метод для ссылки на нулевой объект», это происходит потому, что я пытался получить доступ к элементам из списка слоев через main activity, и я, вероятно, неправильно ссылался на них, что приводит меня сюда.

Я устанавливаю отдельные элементы из своего layer-list.xml что касается переменных, то они были найдены по их идентификаторам. Все мои переменные item возвращались как null. Ниже приведен мой код:

 




import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.ImageView


import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.helper.widget.Layer



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


Log.d("EA","My array list of drawables is created next")
        val hairList = arrayListOf(R.drawable.hairponytailblue , R.drawable.hairponytailpink)
        val mouthList = arrayListOf(R.drawable.smilebigsmile, R.drawable.smileopenmouthfrown)
        val backgroundImageList = arrayListOf(R.drawable.background , R.drawable.background2)
Log.d("XX","done")


Log.d("EA","created the list iterators")
        var hairListIterator = hairList.iterator()
        var mouthListIterator = mouthList.iterator()
        var backgroundImageListIterator = backgroundImageList.iterator()

        Log.d("XX","done")


Log.d("EA","Below I created the variable for the images and buttons in use here, I also set my main images image resource to my layer-list.xml")

      //everything seems "fine" at this declaration but when I hover over R.drawable.layer , it returns its exact path on my computer in bright red, below that it says "@drawable/layer =>layer.xml"
      //
       val basePicture = findViewById<ImageView>(R.id.mainimage).setImageResource(R.drawable.layer)


        val hairButton = findViewById<Button>(R.id.hairbutton)
        val mouthButton = findViewById<Button>(R.id.mouthbutton)
        val backgroundButton = findViewById<Button>(R.id.backgroundbutton)

Log.d("XX","done")

 Log.d("EA","Here I set up the items/layers in layer.xml that I want to change")
        //these keep returning as null in debug but program continues on , I think its because of HOW they were referenced, these are items INSIDE a layer-list.xml.

        val hairLayer = findViewById<Layer>(R.id.layerHair)
        val mouthLayer = findViewById<Layer>(R.id.layerMouth)
        val backgroundLayer = findViewById<Layer>(R.id.layerBackground)

 Log.d("XX","Done")

 Log.d("EA", "Here I set the first of my arrays as each layers first images")

       /*error starts here,
       my error says : "Attempt to invoke virtual method 'void androidx.constraintlayout.helper.widget.Layer.setBackgroundResource(int)' on a null object reference "
       this has something to do with hairLayer...*/

        hairLayer.setBackgroundResource(hairList.first())
        mouthLayer.setBackgroundResource(mouthList.first())
        backgroundLayer.setBackgroundResource(backgroundImageList.first())

Log.d("XX","Done")

Log.d("EA","Here I told my list iterators to do something")

        hairButton.setOnClickListener {
            if( hairListIterator.hasNext()){
                hairLayer.setBackgroundResource(hairListIterator.next())

            }
            else{
                hairLayer.setBackgroundResource(hairList.first())
                hairListIterator = hairList.iterator()
            }
        }
Log.d("EA2","hairLayers new background resource is : "   hairLayer.drawableState)

Log.d("XX","done")






    }
}
 

моя цель с этими элементами списка слоев — изменить их чертежи. Я нашел способы сделать это — например, «mutate()» и «setDrawableByLayerId()» — но все они имеют отношение к LayerDrawable. Согласно веб-сайту разработчика AndroidStudio, layer-list компилирует layerdrawable? Я тут совсем запутался.

p.s. если мой список слоев еще не является LayerDrawable, как мне преобразовать его в один из них? Я чувствую, что если бы я мог преобразовать свой список слоев в LayerDrawable где-нибудь в начале кода, тогда мне не пришлось бы постоянно пытаться ссылаться на отдельные элементы внутри Layer-list.xml .

Ответ №1:

A layer-list преобразуется в LayerDrawable объект во время выполнения, т. Е. Это одно и то же.

Невозможно извлечь item непосредственно из LayerDrawable by id . Вот как это работает (пример Java):

 LayerDrawable layers = (LayerDrawable) ContextCompat.getDrawable( this, R.drawable.layer-list ); // assuming 'layer-list' is indeed your filename.

List<Drawable> hairList = Arrays.asList( 
    new Drawable[]{layers.getDrawable( layers.findIndexById( R.id.hairponytailblue ) ),
                   layers.getDrawable( layers.findIndexById( R.id.hairponytailpink ) ) 
});