Mit Layout-binding auf fremdes Layout zugreifen

  • Antworten:2
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 602

12.10.2021, 17:26:20 via Website

Hallo zusammen

In meiner App verbinde ich die Objekte vom Layout zur Activity mit ActivityMainbinding

private lateinit var binding: ActivityMainBinding
binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)

Das funktioniert ohne Probleme.
Nun habe ich die Situation, dass ich zwei Layouts habe aber nur die MainActivity. Nun möchte ich von der MainActivity auf ein Button zugreifen welcher im Layout "no_permission" ist.
image

Wie muss ich vorgehen, damit ich auf den Button vom Layout "no_permission" zugreifen kann?

MainActivity:

package ch.robbisoft.sensordemo3

import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import ch.robbisoft.sensordemo3.databinding.ActivityMainBinding

private const val PREFERENCES_KEY = "last"
private const val REQUEST_ACTIVITY_RECOGNITION = 123
fun updateSharedPrefs(context: Context?, last : Int){
val edit = getSharedPreferences(context)?.edit()
edit?.putInt(PREFERENCES_KEY, last)
edit?.apply()
}
private fun getSharedPreferences(context: Context?) = context?.getSharedPreferences(MainActivity::class.simpleName, Context.MODE_PRIVATE)

class MainActivity : AppCompatActivity(), SensorEventListener {

private lateinit var binding: ActivityMainBinding
private lateinit var manager: SensorManager
private var sensor : Sensor? = null
private var hasSensor = false
private var last = 0

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        manager = getSystemService(SensorManager::class.java)
    }
    sensor = manager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)
    hasSensor = sensor != null
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && checkSelfPermission(Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED) {
        setContentView(R.layout.no_permission)
        binding.btnRechte.setOnClickListener {
            requestPermissions(
                arrayOf(Manifest.permission.ACTIVITY_RECOGNITION),
                REQUEST_ACTIVITY_RECOGNITION
            )
        }
    }else{
            showStepCounterUi()
        }
    }

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if(requestCode == REQUEST_ACTIVITY_RECOGNITION && grantResults.isEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        showStepCounterUi()
    }
}

override fun onSensorChanged(sensorEvent: SensorEvent){
    val values = sensorEvent.values
    updateSteps(values[0].toInt())
}

override fun onAccuracyChanged(sensor: Sensor?, i : Int){

}

private fun updateSteps(currentSteps : Int){
    last = currentSteps
    binding.tvAusgabe.text = "{$currentSteps - getLastStoredStepCount()}"
}

private fun getLastStoredStepCount() = getSharedPreferences(this)?.getInt(PREFERENCES_KEY, 0) ?: 0

private fun showStepCounterUi(){
    setContentView(R.layout.activity_main)
    binding.reset.setOnClickListener {
        updateSharedPrefs(this, last)
        updateSteps(last)
    }
    binding.onOff.setOnCheckedChangeListener { buttonView, isChecked ->
        if (isChecked){
            manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI)
        }else{
            manager.unregisterListener(this)
        }
    }
    binding.onOff.isEnabled = hasSensor
    binding.onOff.isChecked = hasSensor
    binding.reset.isEnabled = hasSensor
    binding.tvAusgabe.text =getString(
        if(!hasSensor){
            R.string.no_sensor
        }else{
            R.string.waiting
        }
    )
}

}

Activity_main Layout:

<?xml version="1.0" encoding="utf-8"?>

xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/lay_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/tv_ausgabe"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.325" />

<Button
    android:id="@+id/reset"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="356dp"
    android:text="zurücksetzen"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tv_ausgabe" />

<Button
    android:id="@+id/btn_rechte"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/request"
    app:layout_constraintBottom_toTopOf="@+id/on_off"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/reset" />

<Switch
    android:id="@+id/on_off"
    android:layout_width="206dp"
    android:layout_height="55dp"
    android:text="Einschalten"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.781"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.62" />

no_permission Layout:

<?xml version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
    android:id="@+id/info"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/no_permission"
    android:textAlignment="center"
    android:textSize="16pt" />

<Button
    android:id="@+id/button_permission"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/request" />

Gruss Renato

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.527

13.10.2021, 22:08:38 via Website

Hallo
Erst mal eins vorweg du gannst nicht zwei Layouts zu gleichen Zeit laden.
Entweder das der MainActivity oder das von no_permission.

Du nimmt mit binding immer Bezug auf dein MainActivity Layout.

Du lädst zwar mit Setcontentview dein zweites Layout. Danach ist aber dein MainActivity Layout nicht mehr aktiv.

Wenn du darauf mit dem dem binding zugreifen willst solltest du eine anderer binding Variable von Typ NoPermissionBinding erstellen und mit setconrentview laden.
Dann kannst du auch mit der Variablen darauf zugreifen.

— geändert am 13.10.2021, 22:13:36

Hilfreich?
Robbiani Renato
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 602

14.10.2021, 09:22:13 via Website

Danke Jokel, nun funktioniert es.

Hilfreich?
Kommentieren