Я разрабатываю приложение для Android, которое позволяет пользователям входить в систему со своими учетными записями Google, когда пользователь входит в систему со своей учетной записью Google. Диалоговое окно должно появиться, чтобы спросить ему ввести некоторые данные (возраст и пол).Как остановить поток выполнения при открытии диалогового окна в Android
Вот мой DialogBox класс:
public class DialogBox extends DialogFragment implements View.OnClickListener, AdapterView.OnItemSelectedListener {
private static final String TAG = DialogBox.class.getSimpleName();
private Button okButton;
private Spinner ageSpinner;
private RadioButton radioDialogMale;
private RadioButton radioDialogFemale;
private String selectedAge;
private Communicator communicator;
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log.d(TAG, "onCreateDialog(Bundle) - Ini ");
Log.d(TAG, "onCreateDialog(Bundle) - Fi ");
return super.onCreateDialog(savedInstanceState);
}
public void onAttach(Activity activity) {
super.onAttach(activity);
communicator = (Communicator) activity;
}
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView(LayoutInflaterm ViewGroup, Bundle) - Ini ");
View view = inflater.inflate(R.layout.dialog_box_layout, null);
ageSpinner = (Spinner) view.findViewById(R.id.age_spinner_dialog);
ageSpinner.setSelected(false);
ageSpinner.setAdapter(populateAgeSpinner());
ageSpinner.setOnItemSelectedListener(this);
radioDialogMale = (RadioButton) view.findViewById(R.id.radioDialogM);
radioDialogMale.setSelected(false);
radioDialogMale.setOnClickListener(this);
radioDialogFemale = (RadioButton) view.findViewById(R.id.radioDialogF);
radioDialogFemale.setSelected(false);
radioDialogFemale.setOnClickListener(this);
okButton = (Button) view.findViewById(R.id.dialog_ok);
okButton.setOnClickListener(this);
setCancelable(false);
Log.d(TAG, "onCreateView(LayoutInflaterm ViewGroup, Bundle) - Fi ");
return view;
}
@Override
public void onClick(View v) {
Log.d(TAG, "onClick(View) - Ini ");
switch (v.getId()) {
case R.id.radioDialogF:
radioDialogFemale.setSelected(true);
break;
case R.id.radioDialogM:
radioDialogMale.setSelected(true);
break;
case R.id.dialog_ok:
if(validate()) {
String gender = "M";
if(radioDialogFemale.isSelected()) {
gender = "F";
}
communicator.onDialogValues(gender,Integer.parseInt(selectedAge));
}
break;
}
Log.d(TAG, "onClick(View) - Ini ");
}
// To fill the age spinner
public ArrayAdapter<Integer> populateAgeSpinner() {
Log.d(TAG ,"populateAgeSpinner - Ini");
List age = new ArrayList<String>();
age.add("");
for(int i = 18; i <= 100; i++) {
age.add(Integer.toString(i));
}
ArrayAdapter<Integer> spinnerAgeAdapter = new ArrayAdapter<Integer>(getActivity(),R.layout.spinner_item_layout, age);
spinnerAgeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Log.d(TAG ,"populateAgeSpinner - Fi");
return spinnerAgeAdapter;
}
public boolean validate() {
Log.d(TAG ,"validate() - Ini");
boolean result = true;
if(selectedAge.equals(null) || selectedAge.isEmpty()) {
TextView errorText = (TextView)ageSpinner.getSelectedView();
errorText.setError(getResources().getString(R.string.Error_register_age));
result = false;
}
if(!radioDialogFemale.isSelected() && !radioDialogMale.isSelected()) {
radioDialogFemale.setError(getResources().getString(R.string.Error_register_gender));
radioDialogMale.setError(getResources().getString(R.string.Error_register_gender));
result = false;
}
Log.d(TAG ,"validate() - Fi");
return result;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
selectedAge = parent.getItemAtPosition(position).toString();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
public interface Communicator {
void onDialogValues(String gender, int age);
}
}
и вот активность, когда диалоговое окно вызывается для показа:
public class LoginActivity extends BaseActivity implements GoogleApiClient.OnConnectionFailedListener, View.OnClickListener
,DialogBox.Communicator
{
................
protected void updateActivity(FirebaseUser user) {
Log.d(TAG ,"updateActivity(FirebaseUser) - Ini");
if(user != null) {
ArrayList<String> providers = (ArrayList<String>) user.getProviders();
if(!providers.isEmpty() && providers.get(0).equals("google.com")) {
username = user.getEmail().substring(0,user.getEmail().indexOf('@'));
username = "mary";
String userId = user.getUid();
final boolean[] exist = {false};
DatabaseReference databaseReference = database.getReference();
Query query = databaseReference.child("Users").orderByChild(userId).equalTo(userId);
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot userSnapShot : dataSnapshot.getChildren()){
if (!userSnapShot.getKey().equals(null) && !userSnapShot.getKey().isEmpty()) {
exist[0] = true;
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if(!exist[0]) {
// DialogBox dialog = new DialogBox();
showDialog();
}
}
Intent i = new Intent(LoginActivity.this, HomeActivity.class);
startActivity(i);
finish();
}
Log.d(TAG ,"updateActivity(FirebaseUser) - Fi");
}
public void showDialog() {
Log.d(TAG, "showDialog(View) - Ini");
FragmentManager manager = getFragmentManager();
DialogBox dialog = new DialogBox();
dialog.show(manager,"DialogBox");
Log.d(TAG, "showDialog(View) - Ini");
}
@Override
public void onDialogValues(String sexe, int age) {
gender = sexe;
selectedAge = String.valueOf(age);
}
}
Диалоговое окно отображается, но исполнение не остановить и строка:
Intent i = new Intent(LoginActivity.this, HomeActivity.class);
startActivity(i);
finish();
выполнено, поэтому начинается другая деятельность, и у пользователя нет времени e, чтобы ввести данные, запрошенные в диалоговом окне.
Я по достоинству оценит любую помощь для решения этой проблемы.
Спасибо, но это не сработало – rainman
ли вы удалить 'Intent I = новый Intent (LoginActivity.this, HomeActivity.class); startActivity (i); finish(); ' из метода' updateActivity() '? –
Да, абсолютно – rainman