- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要能够从MainActivity.java类中的ArrayList(ScannedDevicesArrayList)中传递ScannedDevicesListItemDialog.java类索引。
我尝试在MainActivity.java类中创建一个函数(getScannedDevicesArrayList)以返回ArrayList,然后在对话框的onClick中调用该函数。但是,在运行程序时,只要单击对话框中的某个项目,应用程序就会崩溃。
如何在对话框中从MainActivity.java引用此ArrayList以便能够执行简单的操作,例如在单击对话框中的项目时将其索引打印到控制台?
MainActivity.java
package com.august.customtisensortagclient;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanResult;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import java.io.StringBufferInputStream;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
BluetoothManager mBluetoothManager;
BluetoothAdapter mBluetoothAdapter;
BluetoothLeScanner mBluetoothScanner;
TextView console;
Button clear_button;
public ArrayList<String> scannedDevicesArrayList = new ArrayList<String>();
int scannedDevicesArrayListTop = -1;
private final static int REQUEST_ENABLE_BT = 1;
private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;
ArrayAdapter<String> myArrayAdapter;
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
console = (TextView) findViewById(R.id.Console);
console.append("Console is working...\n");
registerClearButton();
// Functional code
setupBluetooth();
startScanning();
registerScannedDevicesListCallback();
// Test code
}
public void clearConsole(){
console.setText("Console is working...\n");
scannedDevicesArrayList.clear();
myArrayAdapter.notifyDataSetChanged();
scannedDevicesArrayListTop = -1;
}
private void registerScannedDevicesListCallback() {
list = (ListView) findViewById(R.id.myListView);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView textView = (TextView) view;
DialogFragment newFragment = new ScannedDevicesListItemDialog();
newFragment.show(getSupportFragmentManager(), "ScannedDevicesListItemDialog");
}
});
}
private void registerClearButton(){
clear_button = (Button) findViewById(R.id.clear_button);
clear_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
clearConsole();
}
});
}
public void addDeviceToScannedDevicesList() {
list = (ListView) findViewById(R.id.myListView);
myArrayAdapter = new ArrayAdapter<String>(this,
R.layout.my_list_view_items, scannedDevicesArrayList);
list.setAdapter(myArrayAdapter);
}
public void setupBluetooth() {
// Get BluetoothAdapter
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
// Get BluetoothLeScanner
mBluetoothScanner = mBluetoothAdapter.getBluetoothLeScanner();
// Make sure Bluetooth is enabled
if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
}
// Make sure location is enabled
if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs location access");
builder.setMessage("Please grant location access so this app can detect peripherals.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
PERMISSION_REQUEST_COARSE_LOCATION);
}
});
builder.show();
}
}
// Device scan callback.
private ScanCallback leScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
while (!scannedDevicesArrayList.contains(result.getDevice().getAddress()) && (result.getRssi() > -55)){
scannedDevicesArrayList.add(result.getDevice().getAddress());
scannedDevicesArrayListTop++;
addDeviceToScannedDevicesList();
console.append(Integer.toString(result.getRssi()));
}
}
};
public ArrayList<String> getScannedDevicesArrayList(){
return scannedDevicesArrayList;
}
public int getScannedDevicesArrayListTop() {
return scannedDevicesArrayListTop;
}
public void startScanning() {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
mBluetoothScanner.startScan(leScanCallback);
}
});
}
public void stopScanning() {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
mBluetoothScanner.stopScan(leScanCallback);
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_COARSE_LOCATION: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
System.out.println("coarse location permission granted");
} else {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Functionality limited");
builder.setMessage("Since location access has not been granted, " +
"this app will not be able to discover beacons when in the background.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
}
});
builder.show();
}
return;
}
}
}
}
package com.august.customtisensortagclient;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
public class ScannedDevicesListItemDialog extends DialogFragment {
String[] options = {"Left", "Right"};
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Connect as Left or Right?")
.setItems(options, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MainActivity mainActivity = new MainActivity();
ArrayList<String> thisScannedDevicesArrayList = mainActivity.getScannedDevicesArrayList();
((MainActivity)getActivity()).console.setText("Worked");
((MainActivity)getActivity()).console.setText(thisScannedDevicesArrayList.get(0));
}
});
return builder.create();
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="0dp">
<TextView
android:id="@+id/Console"
android:layout_width="272dp"
android:layout_height="46dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="200dp" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="70dp"
android:layout_alignParentBottom="true"
android:scaleType="fitCenter"
app:srcCompat="@mipmap/gruneisen_logo" />
<Button
android:id="@+id/clear_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignStart="@+id/Console"
android:layout_marginBottom="131dp"
android:text="CLEAR" />
<ListView
android:id="@+id/myListView"
android:layout_width="match_parent"
android:layout_height="379dp" />
</RelativeLayout>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="44sp">
</TextView>
最佳答案
MainActivity mainActivity = new MainActivity();
getActivity()
函数,该函数将获取Fragment的父Activity的实例,并将其转换为MainActivity:
MainActivity mainActivity = (MainActivity) getActivity();
关于java - 从我的DialogFragment中的MainActivity访问ArrayList <String>遇到麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52338568/
我有一个 AppCompatActivity,它在某个时候显示一个 DialogFragment。在此对话框中,有些项目在删除之前需要确认。通过另一个 Yes/No DialogFragment 询问
我们添加一个通用的/普通的 fragment ,以编程的方式做一些事情,比如: fragmentTransaction.add(containerViewId, fragmentToAdd, frag
我有一个 DialogFragment 向用户显示选项列表,其中一个选项是“删除”选项,当用户按下删除选项时我想显示另一个 DialogFragment 作为确认,不幸的是,确认对话框没有显示。 这是
假设我在一个名为 my_dialog_fragment.xml 的 xml 布局文件中指定了 DialogFragment 的布局,并指定了 layout_width 和 >layout_height
当我设置对话框 fragment 的样式时,android 允许截取对话框 fragment 的屏幕截图,但在删除样式后它会起作用。 下面是对话框 fragment 的onCreate代码 @Over
我的应用程序中有一个带有日期和时间字段的 DialogFragment1(由 MyFragmentActivity 调用)。当用户单击它们时,会出现 DatePickerFragment 和 Time
显示 ProgressDialog 时应用程序崩溃。我正在使用滑出式键盘在手机上进行测试。显示对话框时,我滑动键盘,应用崩溃。 public static class ProgressDialogFr
正如问题中提到的.. 我有一个 fragment ,我从中创建并显示一个 DialogFragment,并将 targetFragment 设置为此当前 fragment 。 DialogFragme
如何在此 DialogFragment 中检索 editText1?它存在于 vraag_banen.xml 中,但 getView() 为空。 该对话框显示正常,也没有编译错误,但是我无法弄清楚如何
我应该如何创造这个设计的优越部分? 我正在使用 DialogFragment 在弹出窗口中执行此操作,但无法实现顶部透明的效果。 按钮设计但 background_circle: 使用
最后,我发现问题是什么...... 如果你有这样的功能: public void test() { DialogFragment dlg = new LoginDialog(); dl
我有一个带有监听器的 DialogFragment,用于单击按钮以调用 fragment 中的函数。 我收到 lateinit property listener has not been initi
我在 Activity 上有一个 DialogFragment。此 DialogFragment 是一个由 Web 服务调用填充的 ListView 。单击此 ListView 中的一行后,对话框应消
我正在尝试遵循本教程:http://developer.android.com/guide/topics/ui/controls/pickers.html#DatePicker 这是他们提供的代码,所
有什么方法可以更改 DialogFragment 中正面、负面和中性按钮的显示顺序,以便我可以先放置负面按钮? 我不想改变按钮的“性质”,而是保持它们为“积极”、“消极”和“中性”。 最佳答案 尝试这
这里可能重复,抱歉... 我不知道如何将自定义样式添加到我的 DialogFragment。此刻我正在上课 public final class SelectFragment extends Dial
我花了几个小时来让这个简单的用例正常工作:当我按下音量硬件按钮时,我想打开一个 DialogFragment。该对话框包含一个 SeekBar,应根据按下的按钮进行设置。 我这里有几个问题。 首先,我
DialogFramgment 有问题(在多个 Android 4.2/4.4 设备上支持 v4 库)。 我有两个 DialogFragment:EditAccountDialogFragment 和
当我将有效代码从 fragment 复制到dialogfragment时,它突然不起作用。 在常规 fragment 上:将位图保存在 sd 卡上。 on dialogfragment: 不将位图保存
我花了一整天的时间试图弥补这一点,但我不能.. 这就是问题所在:我想要一个是/否 AlertDialog方向改变时不会消失,所以我决定使用 DialogFragment . 所以我准备了代码并第一次使
我是一名优秀的程序员,十分优秀!