#android #broadcastreceiver #android-spinner #android-alertdialog #android-dialogfragment
#Android #broadcastreceiver #android-счетчик #android-alertdialog #android-dialogfragment
Вопрос:
У меня есть класс, который расширяет DialogFragment в рамках моей основной деятельности. Цель этого класса — вызвать диалоговое окно со счетчиком и отредактировать текст, а затем вернуть эти строки в основное действие. У меня возникла проблема с заполнением моего счетчика. Предполагается, что счетчик отображает список доступных сетей Wi-Fi, но вместо этого он ничего не показывает.
Итак, мой вопрос в том, как я могу использовать свой класс широковещательного приемника для заполнения счетчика, когда это необходимо в диалоговом окне оповещения? Спасибо за любую помощь, вот код, который у меня есть в настоящее время…
Редактировать
Я выполнил некоторую проверку ошибок в своей программе, и кажется, что широковещательный приемник никогда не вызывается из фрагмента диалогового окна, как я могу запустить широковещательный приемник, который находится во фрагменте диалогового окна?
public static class MyAlertDialogFragment extends DialogFragment {
Spinner sp;
WifiManager mainWifiObj;
WifiScanReceiver wifiReciever;
ListView list;
String wifis[];
EditText nameANick;
public static final String MyPREFERENCES = "MyPrefs";
public static final String Name = "nameKey";
SharedPreferences sharedpreferences;
public static MyAlertDialogFragment newInstance(String title) {
MyAlertDialogFragment frag = new MyAlertDialogFragment();
Bundle args = new Bundle();
args.putString("title", title);
frag.setArguments(args);
return frag;
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i("Dialog", "OnCreate");
sharedpreferences = getActivity().getSharedPreferences(MyPREFERENCES,
Context.MODE_PRIVATE);
mainWifiObj = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
wifiReciever = new WifiScanReceiver();
mainWifiObj.startScan();
}
public void onDestroy() {
getActivity().unregisterReceiver(wifiReciever);
super.onDestroy();
}
class WifiScanReceiver extends BroadcastReceiver {
@SuppressLint("UseValueOf")
public void onReceive(Context c, Intent intent) {
List<ScanResult> wifiScanList = mainWifiObj.getScanResults();
wifis = new String[wifiScanList.size()];
int j = 0;
if (sharedpreferences.contains(Name)) {
wifis[0] = sharedpreferences.getString(Name, "");
for (int i = 1; i < wifiScanList.size(); i ) {
wifis[i] = ((wifiScanList.get(j).SSID));
j ;
}
} else {
for (int i = 0; i < wifiScanList.size(); i ) {
wifis[i] = ((wifiScanList.get(j).SSID));
j ;
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getActivity(), android.R.layout.simple_spinner_item,
wifis);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);
}
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getActivity());
LinearLayout root = (LinearLayout) inflater.inflate(
R.layout.my_dialog, null);
nameANick = (EditText) root.findViewById(R.id.editText1);
sp = (Spinner) root.findViewById(R.id.spinner1);
return new AlertDialog.Builder(getActivity())
.setTitle("Set Nickname1")
.setView(root)
.setPositiveButton("Save",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
((MainActivity) getActivity())
.doPositiveClick();
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
((MainActivity) getActivity())
.doNegativeClick();
}
}).create();
}
}
Ответ №1:
Я изменил логику программы, и теперь она работает. Вместо объявления широковещательного приемника внутри класса диалогового окна оповещения, вызовите его с помощью onCreate основного действия. Таким образом, вы можете передать массив строк во фрагмент диалогового окна, а затем заполнить счетчик этим.