setContentView切换页面(无需每次都findViewById)-----二

本文总结了一个关于Android应用中界面切换的问题。主要讨论了如何通过使用全局变量和LayoutInflater实例化视图来实现界面A与B之间的相互跳转。文章详细解释了如何避免在多次跳转时出现的问题,并给出了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.csdn.net/yanzi1225627/article/details/7802402这里是我以前写的总结,这次要用到,可奇怪的是,不管咋弄,从界面A切换到界面B可以,从B到A也可以。再次从A到B死活都不行了。最终的原因在Jum2B 这个函数里,我用了setContentView(R.layout.B)的方法,而不是实例化出来的View BView参数。这里对这个问题,再做一次总结:

假设两个界面A和B,A里有Button为btn1, B里有Button为btn2. 启动时是界面A,然后按按键btn1和btn2可以切换到另外一个界面里。

1,这两个Button要弄成全局变量,如果在onCreate函数里弄成final 应该也行。

2,在全局变量里要定义两个View AView = null, View BView = null, 然后在onCreate里用inflater实例化一下。

3,之后弄两个函数Jump2B, Jump2A,这两个函数里setContentView传进去的参数是上面定义的View参数。两个View 必须都是。然后findViewById的时候,调用(AView).findViewById()这种方法。

4,在onCreate里设置btn1的监听,调用Jump2B方法,在Jump2B方法里,实例化出来btn2, 并设置监听。增加一个flag,只需设置监听一次就可以了。

 

注意:要点是setContentView传进去的参数是用inflater实例化的View, 在Button 的实例化时调用(AView).findViewById() 。

package com.example.juble_app; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.example.juble_app.callback.BleCallback; import com.example.juble_app.utils.BleHelper; import com.example.juble_app.viewmodle.MyViewModel; import com.google.android.material.bottomnavigation.BottomNavigationView; public class ModbusConnectActivity extends AppCompatActivity { /** Gatt / private static BluetoothGatt bluetoothGatt; /* 设备是否连接 / private boolean isConnected = false; /* Gatt回调 / private BleCallback bleCallback; /* MODBUS数据 */ private MyViewModel viewModel; private BottomNavigationView bottomNavigationView; private Button modbus_get; private TextView address; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_modbus_connect); // 创建Handler用于更新UI Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 更新TextView显示收到的内容 String receivedContent = (String) msg.obj; viewModel.setData(receivedContent); } }; bleCallback = new BleCallback(handler); //获取上个页面传递过来的设备 BluetoothDevice device = getIntent().getParcelableExtra("device"); //连接gatt 设置Gatt回调 bluetoothGatt = device.connectGatt(this, false, bleCallback); bottomNavigationView = findViewById(R.id.bottomNavigationView); modbus_get = findViewById(R.id.actionButton); modbus_get.setOnClickListener(v -> { String command = "00420017000109D0"; // 发送指令到子线程 new Thread(() -> { BleHelper.sendCommand(bluetoothGatt, command, true); }).start(); }); address = findViewById(R.id.displayTextView); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); } /** Toast提示 @param msg 内容 */ private void showMsg(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }分析此段代码,并代码实现将modbus_get.setOnClickListener(v -> { String command = "00420017000109D0"; // 发送指令到子线程 new Thread(() -> { BleHelper.sendCommand(bluetoothGatt, command, true); }).start(); });返回数据显示在address控件上,不在handler中做修改,
最新发布
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值