如何使用AlertDialog Android更改MainActivity的变量(How to change MainActivity's variable with AlertDialog

编程入门 行业动态 更新时间:2024-10-26 09:18:52
如何使用AlertDialog Android更改MainActivity的变量(How to change MainActivity's variable with AlertDialog Android)

大家早上好,

我遇到过AlertDialog的一些问题。 我有一个EditText组件,我想在MainActivity的变量中输入文本。

这是我的代码:

private void showDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); final EditText input = new EditText(MainActivity.this); builder.setTitle(R.string.title); builder.setMessage(R.string.enter_comment); builder.setView(input); builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // name is the variable I want to change. It has been declared as String name; at the beginning of my MainActivity class. name = input.getText().toString(); showToast(name); } }); builder.setNegativeButton(R.string.annuler, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); this.runOnUiThread(new Runnable() { public void run() { builder.show(); } }); // This line makes the app crash. It doesn't print "Null String" as it should. //showToast(name); } private void showToast(String str) { if (str != null) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "Null String", Toast.LENGTH_SHORT).show(); } }

我希望你能帮助我。 先谢谢你 !

编辑 - 添加完整代码 (导入除外 - >太多)

package com.example.ghost.boxmonitor; public class MainActivity extends Activity { public final String ACTION_USB_PERMISSION = "com.ghost.boxmonitor.USB_PERMISSION"; Button startButton, clearButton, stopButton; TextView textView; UsbManager usbManager; UsbDevice device; UsbSerialDevice serialPort; UsbDeviceConnection connection; LinkedList<Box> list; String text,name; UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() { //Defining a Callback which triggers whenever data is read. @Override public void onReceivedData(byte[] arg0) { String data = null; try { data = new String(arg0, "UTF-8"); data.concat("/n"); tvAppend(textView, data); buildString(data); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }; private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { //Broadcast Receiver to automatically start and stop the Serial connection. @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION_USB_PERMISSION)) { boolean granted = intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED); if (granted) { connection = usbManager.openDevice(device); serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection); if (serialPort != null) { if (serialPort.open()) { //Set Serial Connection Parameters. setUiEnabled(true); serialPort.setBaudRate(9600); serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8); serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1); serialPort.setParity(UsbSerialInterface.PARITY_NONE); serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); serialPort.read(mCallback); tvAppend(textView,"Serial Connection Opened!\n"); } else { tvAppend(textView,"Port not opened\n"); Log.d("SERIAL", "PORT NOT OPEN"); } } else { tvAppend(textView,"Port null\n"); Log.d("SERIAL", "PORT IS NULL"); } } else { tvAppend(textView,"Perm not granted\n"); Log.d("SERIAL", "PERM NOT GRANTED"); } } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { onClickStart(startButton); } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { onClickStop(stopButton); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); usbManager = (UsbManager) getSystemService(this.USB_SERVICE); startButton = (Button) findViewById(R.id.buttonStart); clearButton = (Button) findViewById(R.id.buttonClear); stopButton = (Button) findViewById(R.id.buttonStop); textView = (TextView) findViewById(R.id.textView); setUiEnabled(false); IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(broadcastReceiver, filter); list = new LinkedList<Box>(); } public void setUiEnabled(boolean bool) { startButton.setEnabled(!bool); stopButton.setEnabled(bool); textView.setEnabled(bool); } public void onClickStart(View view) { HashMap<String, UsbDevice> usbDevices = usbManager.getDeviceList(); if (!usbDevices.isEmpty()) { boolean keep = true; for (Map.Entry<String, UsbDevice> entry : usbDevices.entrySet()) { device = entry.getValue(); int deviceVID = device.getVendorId(); tvAppend(textView, "Device VID : "+Integer.toString(deviceVID)+"\n"); if (deviceVID == 10755 || deviceVID == 9025)//Arduino Vendor ID { PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); tvAppend(textView,"Arduino detected. Waiting for user authorization...\n"); usbManager.requestPermission(device, pi); keep = false; } else { connection = null; device = null; tvAppend(textView,"This device is not an Arduino.\n"); } if (!keep) break; } } else{ tvAppend(textView,"No USB device detected.\n"); } } public void onClickStop(View view) { setUiEnabled(false); serialPort.close(); tvAppend(textView, "\nUSB device unplugged.\nSerial Connection Closed !\n"); } public void onClickClear(View view) { textView.setText(" "); showDialog(); } private void tvAppend(TextView tv, CharSequence text) { final TextView ftv = tv; final CharSequence ftext = text; runOnUiThread(new Runnable() { @Override public void run() { ftv.append(ftext); } }); } public void interpreter(String text){ String table[] = text.split("&"); String def = Integer.toString(list.size() + 1); if (table.length == 2) { if (list.isEmpty()) { //showDialog(); Box b = new Box(table[0], table[1], def); list.add(b); //tvAppend(textView2, b.execute()); } else { boolean isInList = false; for (Box b : list) { if (b.getAddr().compareTo(table[0]) == 0) { isInList = true; b.setState(table[1]); //tvAppend(textView2, b.execute()); } } if (!isInList) { //showDialog(); Box b = new Box(table[0], table[1], def); list.add(b); //tvAppend(textView2, b.execute()); } } } } public void buildString(String data){ int len = data.length(); char c; for (int i = 0; i<len; i++){ c = data.charAt(i); switch (c){ case '#': text = ""; break; case '!': interpreter(text); break; default: text+=c; break; } } } private void showDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); final EditText input = new EditText(MainActivity.this); builder.setTitle("Title"); builder.setMessage("Message"); builder.setView(input); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { name = input.getText().toString(); Log.d("MyTag", "name in onClick()" + name); showToast(name); } }); builder.setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.show(); showToast(name); } private void showToast(String str) { if (str != null) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "Null String", Toast.LENGTH_SHORT).show(); } } }

所以每次我在串行线上接收数据时,我都会构建一个字符串,如果字符串完成,我会调用解释器。 如果字符串描述了一个新的Box,我调用showDialog方法让用户给它一个名字。

编辑编辑 - 解决方案

请参阅下面的答案和相关评论。 据我所知,你不能在UiThread之外的其他线程中更改UI(现在看来很明显,但是......)。

Good morning everybody,

I have encountered some problems with AlertDialog. I have an EditText component, and I would like to get the text entered in a MainActivity's variable.

Here is my code :

private void showDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); final EditText input = new EditText(MainActivity.this); builder.setTitle(R.string.title); builder.setMessage(R.string.enter_comment); builder.setView(input); builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // name is the variable I want to change. It has been declared as String name; at the beginning of my MainActivity class. name = input.getText().toString(); showToast(name); } }); builder.setNegativeButton(R.string.annuler, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); this.runOnUiThread(new Runnable() { public void run() { builder.show(); } }); // This line makes the app crash. It doesn't print "Null String" as it should. //showToast(name); } private void showToast(String str) { if (str != null) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "Null String", Toast.LENGTH_SHORT).show(); } }

I hope you'll be able to help me. Thank you in advance !

EDIT - Added full code (except the imports -> too many)

package com.example.ghost.boxmonitor; public class MainActivity extends Activity { public final String ACTION_USB_PERMISSION = "com.ghost.boxmonitor.USB_PERMISSION"; Button startButton, clearButton, stopButton; TextView textView; UsbManager usbManager; UsbDevice device; UsbSerialDevice serialPort; UsbDeviceConnection connection; LinkedList<Box> list; String text,name; UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() { //Defining a Callback which triggers whenever data is read. @Override public void onReceivedData(byte[] arg0) { String data = null; try { data = new String(arg0, "UTF-8"); data.concat("/n"); tvAppend(textView, data); buildString(data); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }; private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { //Broadcast Receiver to automatically start and stop the Serial connection. @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION_USB_PERMISSION)) { boolean granted = intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED); if (granted) { connection = usbManager.openDevice(device); serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection); if (serialPort != null) { if (serialPort.open()) { //Set Serial Connection Parameters. setUiEnabled(true); serialPort.setBaudRate(9600); serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8); serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1); serialPort.setParity(UsbSerialInterface.PARITY_NONE); serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); serialPort.read(mCallback); tvAppend(textView,"Serial Connection Opened!\n"); } else { tvAppend(textView,"Port not opened\n"); Log.d("SERIAL", "PORT NOT OPEN"); } } else { tvAppend(textView,"Port null\n"); Log.d("SERIAL", "PORT IS NULL"); } } else { tvAppend(textView,"Perm not granted\n"); Log.d("SERIAL", "PERM NOT GRANTED"); } } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { onClickStart(startButton); } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { onClickStop(stopButton); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); usbManager = (UsbManager) getSystemService(this.USB_SERVICE); startButton = (Button) findViewById(R.id.buttonStart); clearButton = (Button) findViewById(R.id.buttonClear); stopButton = (Button) findViewById(R.id.buttonStop); textView = (TextView) findViewById(R.id.textView); setUiEnabled(false); IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(broadcastReceiver, filter); list = new LinkedList<Box>(); } public void setUiEnabled(boolean bool) { startButton.setEnabled(!bool); stopButton.setEnabled(bool); textView.setEnabled(bool); } public void onClickStart(View view) { HashMap<String, UsbDevice> usbDevices = usbManager.getDeviceList(); if (!usbDevices.isEmpty()) { boolean keep = true; for (Map.Entry<String, UsbDevice> entry : usbDevices.entrySet()) { device = entry.getValue(); int deviceVID = device.getVendorId(); tvAppend(textView, "Device VID : "+Integer.toString(deviceVID)+"\n"); if (deviceVID == 10755 || deviceVID == 9025)//Arduino Vendor ID { PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); tvAppend(textView,"Arduino detected. Waiting for user authorization...\n"); usbManager.requestPermission(device, pi); keep = false; } else { connection = null; device = null; tvAppend(textView,"This device is not an Arduino.\n"); } if (!keep) break; } } else{ tvAppend(textView,"No USB device detected.\n"); } } public void onClickStop(View view) { setUiEnabled(false); serialPort.close(); tvAppend(textView, "\nUSB device unplugged.\nSerial Connection Closed !\n"); } public void onClickClear(View view) { textView.setText(" "); showDialog(); } private void tvAppend(TextView tv, CharSequence text) { final TextView ftv = tv; final CharSequence ftext = text; runOnUiThread(new Runnable() { @Override public void run() { ftv.append(ftext); } }); } public void interpreter(String text){ String table[] = text.split("&"); String def = Integer.toString(list.size() + 1); if (table.length == 2) { if (list.isEmpty()) { //showDialog(); Box b = new Box(table[0], table[1], def); list.add(b); //tvAppend(textView2, b.execute()); } else { boolean isInList = false; for (Box b : list) { if (b.getAddr().compareTo(table[0]) == 0) { isInList = true; b.setState(table[1]); //tvAppend(textView2, b.execute()); } } if (!isInList) { //showDialog(); Box b = new Box(table[0], table[1], def); list.add(b); //tvAppend(textView2, b.execute()); } } } } public void buildString(String data){ int len = data.length(); char c; for (int i = 0; i<len; i++){ c = data.charAt(i); switch (c){ case '#': text = ""; break; case '!': interpreter(text); break; default: text+=c; break; } } } private void showDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); final EditText input = new EditText(MainActivity.this); builder.setTitle("Title"); builder.setMessage("Message"); builder.setView(input); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { name = input.getText().toString(); Log.d("MyTag", "name in onClick()" + name); showToast(name); } }); builder.setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.show(); showToast(name); } private void showToast(String str) { if (str != null) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "Null String", Toast.LENGTH_SHORT).show(); } } }

So each time I receive data on the serial line, I build a string, and if the string is complete, I call the interpreter. If the string describes a new Box, I call the showDialog method to ask the user to give it a name.

EDIT EDIT - Solution

Please see the answer below, and the related comments. As far as I understood the problem, you can't change the UI inside another thread than the UiThread (it seems obvious now, but ...).

最满意答案

说实话,我也没有得到你的问题。 代码name = input.getText().toString();这一行name = input.getText().toString(); 对name变量进行赋值。 用日志检查 - 放

name = input.getText().toString(); Log.d("MyTag", "name in onClick()" + name);

然后在控制台中我看到: 在此处输入图像描述 所以它正在发挥作用。 dialog解除后,您可以使用您的name变量。 或者请说明更多细节。

PS。 一个提示。 如果在Activity使用showDialog()方法,则无需使用runOnUiThread技巧。 只需调用builder.show(); , 有用。 好的,这里是Activity完整代码 ,一切正常,包括在showDialog()方法结束时的Toast。

public class MainActivity extends AppCompatActivity { final String ACTION = "myActionForBroadcast"; String name; private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d("MyTag", "onReceive: context" + context.getPackageCodePath()); showDialog(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); IntentFilter filter = new IntentFilter(); filter.addAction(ACTION); registerReceiver(broadcastReceiver, filter); final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { Log.d("MyTag", "Handler run: before send broadcast"); sendBroadcast(new Intent(ACTION)); } }, 5_000); } private void showDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); final EditText input = new EditText(MainActivity.this); builder.setTitle("Title"); builder.setMessage("Message"); builder.setView(input); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Log.d("MyTag", "showDialog onClick: name before assign " + name); name = input.getText().toString(); Log.d("MyTag", "showDialog onClick: name after assign " + name); showToast(name); } }); builder.setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); Log.d("MyTag", "showDialog: before showing dialog"); builder.show(); Log.d("MyTag", "showDialog: before showing toast"); showToast(name); } private void showToast(String str) { if (str != null) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "Null String", Toast.LENGTH_SHORT).show(); } } }

我已经更改了Activity代码。 这是做了什么: 1)我宣布receiver有一些自定义动作; 2)我在启动后5秒钟模仿onReceive() ; 3)在onReceive()我只显示了对话框: 4)将日志放在事件上。

一切正常,请在控制台中查看输出。 在此处输入图像描述

我可以建议你 - 在你的onReceive()只需调用showDialog()并查看它是否有效。 如果是 - 那么你的代码就会出错。 此外,如果您在onCreate()中注册接收器,请不要忘记在onDestroy()中取消注册它!

Saying honestly, I also didn't got your issue. This line in your code name = input.getText().toString(); do assignment to a name variable. Check it with logs - put

name = input.getText().toString(); Log.d("MyTag", "name in onClick()" + name);

Then in console I saw: enter image description here So it's working. After dialog was dismissed, you can use your name variable.Or please specify more details.

PS. One tip. If you use your showDialog() method in your Activity, there is no need to use runOnUiThread trick. Just call builder.show();, it works. Ok, here is complete code of Activity, everything is working, including Toast in the end of showDialog() method.

public class MainActivity extends AppCompatActivity { final String ACTION = "myActionForBroadcast"; String name; private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d("MyTag", "onReceive: context" + context.getPackageCodePath()); showDialog(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); IntentFilter filter = new IntentFilter(); filter.addAction(ACTION); registerReceiver(broadcastReceiver, filter); final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { Log.d("MyTag", "Handler run: before send broadcast"); sendBroadcast(new Intent(ACTION)); } }, 5_000); } private void showDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); final EditText input = new EditText(MainActivity.this); builder.setTitle("Title"); builder.setMessage("Message"); builder.setView(input); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Log.d("MyTag", "showDialog onClick: name before assign " + name); name = input.getText().toString(); Log.d("MyTag", "showDialog onClick: name after assign " + name); showToast(name); } }); builder.setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); Log.d("MyTag", "showDialog: before showing dialog"); builder.show(); Log.d("MyTag", "showDialog: before showing toast"); showToast(name); } private void showToast(String str) { if (str != null) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "Null String", Toast.LENGTH_SHORT).show(); } } }

I've changed code of Activity. Here is what have been done: 1) I declared receiver with some custom action; 2) I emulated onReceive() 5 seconds after start; 3) in onReceive() I just showed dialog: 4) put logs on events.

Everything is working, see the output in console. enter image description here

What I can propose you - in your onReceive() just call the showDialog() and see, if it works. If yes - then something wrong is in your that code. !! Also, if you register receiver in onCreate(), don't forget to unregister it in onDestroy()!

更多推荐

本文发布于:2023-08-03 07:12:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1385364.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:如何使用   变量   AlertDialog   MainActivity   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!