【发布时间】:2015-10-21 04:02:51
【问题描述】:
我有一个带有自定义适配器的ListView,它显示了我周围的 wifi 列表。单击一个项目时,我会显示一个包含详细信息的对话框。该对话框是从DialogFragment 派生的自定义类,并在 Wifi 扫描完成后使用此代码显示:
private class WifiScanReceiver extends BroadcastReceiver {
public void onReceive(Context c, Intent intent) {
List<ScanResult> wifiScanList = wifi.getScanResults();
Log.i("WifiAnal", "rec");
lv.setAdapter(new WifiListAdapter(getApplicationContext(), R.layout.itemlistrow, wifiScanList));
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ScanResult listItem = (ScanResult)lv.getItemAtPosition(position);
WifiDetailsDialogFragment d = new WifiDetailsDialogFragment();
// Supply num input as an argument.
Bundle args = new Bundle();
args.putString("ssid", listItem.SSID);
d.setArguments(args);
d.show(getSupportFragmentManager(), "fir");
// TODO: PUT ASYNC CALL HERE AND PROCESS FETCHED DATA.
// TODO: SHOW ASYNC RESULT ON OPEN DIALOG
}
});
mSwipeRefreshLayout.setRefreshing(false);
}
}
我的 WifiDetailsDialogFragment 类负责扩展其 xml 布局并使用 Ok 按钮将其正确显示在应用程序顶部。
现在想象一下我显示对话框,现在我想运行一个后台任务(比如从外部服务器上的数据库中获取更多详细信息),完成后,如果对话框仍然打开,则将结果放入其布局中(可能操纵一些已经存在和膨胀的 TextViews 的值)。如果到那时它已关闭,则什么也不做。
如何从 onItemClick 启动的后台运行进程访问我的布局小部件?我试过d.getView(),但这会返回null。以某种方式通过FragmentManager 是正确的方法吗?我不想绘制新的对话框,而是编辑现有的成员。
谢谢!
【问题讨论】:
-
您无法从后台线程访问 UI 线程视图,一旦您从数据库或服务器调用 runOnUIThread 方法获取值,然后对对话框片段执行您想做的任何事情。跨度>
-
如何从 runOnUIThread 中获取对对话框内的 TextView 的引用?布局从 onItemClick 内部膨胀
-
我猜你需要通过弱引用将膨胀的内容传递给后台线程。
标签: android android-layout android-fragments android-dialogfragment android-dialog