После успешного прохождения руководства Accessing Google APIs, я пытаюсь переместить весь код, связанный с Google+, с моего MainActivity
на отдельный пользовательский номер GoogleFragment.Вызвать DialogFragment из пользовательского фрагмента, а затем установить его свойство
Однако я застрял на самом последнем месте - в моем пользовательском фрагменте, я не знаю, как получить доступ к mResolvingError
поле после того, как DialogFragment
был уволен:
public class GoogleFragment extends Fragment
implements GoogleApiClient.OnConnectionFailedListener {
private boolean mResolvingError = false; // HOW TO ACCESS?
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
if (mResolvingError) {
// Already attempting to resolve an error.
return;
} else if (connectionResult.hasResolution()) {
try {
mResolvingError = true;
connectionResult.startResolutionForResult(getActivity(), REQUEST_RESOLVE_ERROR);
} catch (IntentSender.SendIntentException e) {
// There was an error with the resolution intent. Try again.
if (mGoogleApiClient != null)
mGoogleApiClient.connect();
}
} else {
// Show dialog using GoogleApiAvailability.getErrorDialog()
showErrorDialog(connectionResult.getErrorCode());
mResolvingError = true;
}
}
private void showErrorDialog(int errorCode) {
// Create a fragment for the error dialog
ErrorDialogFragment dialogFragment = new ErrorDialogFragment();
// Pass the error that should be displayed
Bundle args = new Bundle();
args.putInt(ARGS_DIALOG_ERROR, errorCode);
dialogFragment.setArguments(args);
dialogFragment.show(getActivity().getSupportFragmentManager(), TAG_DIALOG_ERROR);
}
public static class ErrorDialogFragment extends DialogFragment {
public ErrorDialogFragment() {
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Get the error code and retrieve the appropriate dialog
int errorCode = this.getArguments().getInt(ARGS_DIALOG_ERROR);
return GoogleApiAvailability.getInstance().getErrorDialog(
this.getActivity(),
errorCode,
REQUEST_RESOLVE_ERROR);
}
@Override
public void onDismiss(DialogInterface dialog) {
mResolvingError = false; // DOES NOT COMPILE
}
}
}
Что я должен делать здесь, пожалуйста, ?
Если я делаю ErrorDialogFragment
нестатическим я получаю ошибку компиляции:
This fragment inner class should be static (GoogleFragment.ErrorDialogFragment)
Если я держу его статическим - я не могу получить доступ к переменному либо.
Я имею в виду 2 обходные пути для моей проблемы:
- Использование
LocalBroadcastManager
для отправки пользовательскихIntent
изErrorDialogFragment
вGoogleFragment
- Определить пользовательский метод в
GoogleFragment
и доступ к нему черезgetSupportFragmentManager().findFragmentByTag()
Но может быть, есть более простое решение?
UPDATE:
Я изменил mResolvingError
поле для общественности и попробовал этот код:
@Override
public void onDismiss(DialogInterface dialog) {
GoogleFragment f = (GoogleFragment) getActivity().getSupportFragmentManager().findFragmentByTag(GoogleFragment.TAG);
if (f != null && f.isVisible()) {
f.mResolvingError = false;
}
}
, но я не знаю, как проверить это правильно, и если f.isVisible()
необходим там ...
UPDATE 2:
Может быть как-то использовать DialogInterface.OnDismissListener с GoogleApiAvailability.getInstance().getErrorDialog в моем коде?
Вы должны сделать это наоборот: вызываемый должен отправить результат получателю. Для этого заставьте caller реализовать интерфейс прослушивателя, чтобы вызывающий использовал его для передачи результата. Если вызывающий объект является Activity, ваш фрагмент вызываемого объекта может получить его с помощью 'getActivity()'. Если вызывающий объект является фрагментом, используйте 'setTargetFragment()' для вызываемого лица при его создании, а 'getTargetFragment()' позволит вам получить вызывающего абонента. – BladeCoder
К сожалению, нельзя использовать 'setTargetFragment()' в моем приложении minSdkLevel 9 ... Кроме того, я запутался: внутренний класс должен быть статическим, так что 'GoogleFragment' (со сложным жизненным циклом) не содержит ссылки на' ErrorDialogFragment '. Но если я использую шаблон интерфейса - тогда между ними будет ссылка через переменную 'mListener'. –
Вы можете использовать каждый метод Фрагмента из API 4, если вы используете библиотеку поддержки (как и должно быть). Все классы фрагментов должны быть статичными, поскольку фреймворк должен быть в состоянии инициировать их, вызывая пустой публичный конструктор. Вы не должны содержать ссылку на слушателя, вместо этого вы должны использовать 'getTargetFragment()' или 'getActivity()'. Ссылки будут очищены, когда фрагмент будет отделен от Activity и повторно инициализирован правильно, когда фрагмент будет восстановлен и повторно подключен. Это происходит, например, при изменении ориентации экрана. – BladeCoder