2016-09-18 4 views
0

Я разрабатываю приложение для 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, чтобы ввести данные, запрошенные в диалоговом окне.

Я по достоинству оценит любую помощь для решения этой проблемы.

ответ

1

Сделайте свою деятельность для реализации DialogInterface.OnDismissListener, а затем внутри метода onDismiss создайте намерение для следующего действия и запустите его.

Intent i = new Intent(LoginActivity.this, HomeActivity.class); 
    startActivity(i); 
    finish(); 
+0

Спасибо, но это не сработало – rainman

+0

ли вы удалить 'Intent I = новый Intent (LoginActivity.this, HomeActivity.class); startActivity (i); finish(); ' из метода' updateActivity() '? –

+0

Да, абсолютно – rainman

0

Код завершения будет выполняться всегда, так как открытие диалога не предотвращает запуск кода.

Таким образом, вы должны запустить код отделки в методе распускать от DialogFragment() НЕ в updateActivity() метода:

public void showDialog() { 

    Log.d(TAG, "showDialog(View) - Ini"); 

    FragmentManager manager = getFragmentManager(); 

    DialogBox dialog = new DialogBox(); 
    dialog.show(manager, "DialogBox"); 
    dialog.onDismiss(dismiss()); 

    Log.d(TAG, "showDialog(View) - Ini"); 
} 

private DialogInterface dismiss() { 
    Intent i = new Intent(LoginActivity.this, HomeActivity.class); 
    startActivity(i); 
    finish(); 
    return null; 
}