我看到this question关于将一个微调器放在AlertDialog中,但从我看到的对话框显示,脚本继续。一旦做出选择,它也会迅速关闭。如果你有一个onDismiss
或onClick
监听器根据你选择的内容触发一个单独的函数/活动,这将是很好的,但这不是我需要的。
目前,我的应用正在轮询TimerTask
内的网址,并检索数据。在此TimerTask
内,数据被解析并最终保存。根据数据,可能需要询问用户其他详细信息。
我的目标是等到用户从微调器对话框中进行选择,点击"确定"按钮,然后继续解析数据并将其发送到另一个类以存储在数据库中。我怎么能这样做?
Timer timer = new Timer();
TimerTask checkApi = new TimerTask(){
@Override
public void run(){
try {
JSONObject changes = new JSONObject(/* External class that gets data from URL */);
if (changes.getBoolean("success")){
/* This is where the data is parsed */
/* Example skeleton code: */
JSONObject parsed_data = changes.getJSONObject("some_data");
if (changes.has("possibly missing detail")){
// This is where I want to wait for the selection to be made
String detail = dialogSpinnerResponse();
} else {
String detail = changes.getString("possibly missing detail");
}
parsed_data.put("important_detail", detail);
JSONObject reponse = new JSONObject(/* Result from sending parsed_data to external class for saving */);
// error handling if needed ...
} else {
e.printStackTrace();
}
} catch (JSONException e){
e.printStackTrace();
}
}
};
此计时器任务在任何函数之外初始化,作为Main类顶部的变量,并在我的活动的onCreate()
方法中启动。
我已对此进行了测试,并正确轮询了网址并显示了未经过滤的数据。现在我正在实现它的解析部分,我需要等待用户输入,然后将其发送到保存它的外部类。
答案 0 :(得分:0)
我决定使用我的常识并简单地创建第二个仅在细节已知时运行的函数。这是我的代码,任何人都想做这样的事情。它阻止用户关闭Dialog,并在onClick
监听器或运行详细信息时立即运行解析功能。
TimerTask checkApi = new TimerTask(){
@Override
public void run(){
try {
JSONObject changes = new JSONObject(/* External class that gets data from URL */);
if (changes.getBoolean("success")){
/* This is where the data is parsed */
/* Example skeleton code: */
JSONObject parsed_data = changes.getJSONObject("some_data");
if (changes.has("possibly missing detail")){
parseData(changes, changes.getString("possibly missing detail"));
} else {
// todo: Ask user for detail
AlertDialog.Builder dialog_builder = new AlertDialog.Builder(MainActivity.this);
View mView = getLayoutInflater().inflate(R.layout.dialog_spinner, null);
dialog_builder.setMessage(R.string.need_detail_message);
dialog_builder.setTitle(R.string.need_detail_title);
final Spinner spinner = (Spinner) mView.findViewById(R.id.spinner);
List<String> detail_list = /* details from external class */;
detail_list.add(0, getString(R.string.need_detail_select));
ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_item, detail_list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
dialog_builder.setPositiveButton(R.string.CONTINUE_GENERAL, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do nothing yet
}
});
dialog_builder.setView(mView);
final AlertDialog dialog = dialog_builder.create();
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String selection = spinner.getSelectedItem().toString();
if (!selection.equals(getString(R.string.need_detail_select))){
// todo: send to function
parseData(changes, selection);
dialog.dismiss();
} else {
Toast.makeText(Tracking.this, R.string.need_detail_toast, Toast.LENGTH_SHORT).show();
}
}
});
}
} else {
e.printStackTrace();
}
} catch (JSONException e){
e.printStackTrace();
}
}
};
private void parseData(JSONObject changes, String detail){
/* Do werk */
}
哇
Double-U,哦,Double-U。