Pantalla de inicio de sesión que muestra progressdialog y permite cambiar la orientación de la pantalla
Hola estoy tratando de implementar una pantalla de inicio de sesión que muestra un diálogo de progreso y permitir que el teléfono para rotar.
Quiero preguntar cuál es la mejor manera de hacer eso (IntentService, AsyncTask, Servicio) y permitir que el teléfono para rotar?
- Problemas al llamar a AsyncTask de IntentService
- ¿El intento va cola cuando llama a startService para IntentService varias veces?
- IntentService - encuentra el número de Intents esperando en la cola
- Android RuntimeException: No se puede crear una instancia del servicio
- cómo despertar mi servicio intención cada 5 minutos
He leído muchas respuestas diciendo cosas diferentes usando un fragmento vacío con AsyncTask, etc.
- Geofence funciona pero después de un tiempo deja de activar
- Servicio automático llamado en la actividad de destrucción
- No se puede encontrar la clase de actividad explícita {}; Has declarado esta actividad en tu AndroidManifest.xml
- OnHandleIntent () no se llama en IntentService
- ¿Cuál es la diferencia entre un IntentService y un Servicio?
- Servicio vs IntentService
- Java.lang.ClassCastException: android.os.ResultReceiver no se puede convertir en com.hello.utils.network.MyReciever
- ¿Debo usar Service o IntentService para mi aplicación android?
Usted puede hacer algo como eso en el manifiesto para permitir la rotación:
<application android:allowBackup="true" android:configChanges="orientation|keyboardHidden|screenSize" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".activities.MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name"/>
Entonces usted puede coger la rotación con este snipet dentro de su actividad:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.v(this.getClass().getName(), "onConfigurationChanged()"); }
Para hacer un asíntato con diálogo de progreso, este snipet debe darle un ligth:
private ProgressDialog pDialog; private class MyAsync extends AsyncTask<String, Void, String> { Activity context; public MyAsync (Activity context) { this.context = context; } @Override protected void onPreExecute(){ super.onPreExecute(); pdia = new ProgressDialog(context); pdia.setMessage("Loading..."); pdia.show(); } @Override protected String doInBackground(String... urls) { ... //do your login scheme ... //context.methods() return "ok"; } @Override protected void onPostExecute(String result) { pDialog.dismiss(); if(result!=null && result.equals("ok")){ //login was successfully done } else { //login has failed } } }
Y para usar este asincestreo que debe llamar:
new MyAsync(this).execute(null, null , null);
Por cierto, this
es tu actividad / fragmento.
Prueba a añadir este atributo android:configChanges="orientation"
a tu elemento Activity en el archivo AndroidManifest.xml
. Mostrar un ProgressDialog en el método onPreExecute de un objeto AsyncTask y cancelar el ProgressDialog en el método onPostExecute. DoInBackground está en ejecución Cuando cambia la orientación.
Consulte http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html para obtener una respuesta detallada.
Básicamente, puede usar fragmento con setRetainInstance establecido como true dentro de su LoginActivity para que no se destruya cuando se recrea la actividad durante el cambio de orientación.
Código de muestra :
public class AsyncFragment extends Fragment { private LoginTask mTask; private AsyncTaskListener mListener; private static final String TAG = "AsyncFragment"; private boolean isTaskRunning = false; private ProgressDialog mProgressDialog; FrameLayout mLayout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); mTask = new LoginTask(); mTask.execute(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mLayout = new FrameLayout(getActivity()); mLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); if(isTaskRunning) { mProgressDialog = new ProgressDialog(getActivity()); mProgressDialog.show(); } return mLayout; } @Override public void onDestroyView() { if(mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); mProgressDialog = null; } super.onDestroyView(); } @Override public void onAttach(Context context) { super.onAttach(context); try { mListener = (AsyncTaskListener) context; } catch (ClassCastException e) { Log.d(TAG, "Class not instance of AsyncTaskListener"); } } @Override public void onDetach() { mListener = null; super.onDetach(); } private class LoginTask extends AsyncTask<Void,Integer,Void> { @Override protected Void doInBackground(Void... params) { if(mListener != null) { mListener.onBackground(); } SystemClock.sleep(10000); return null; } @Override protected void onPreExecute() { isTaskRunning = true; mProgressDialog = new ProgressDialog(getActivity()); mProgressDialog.show(); if(mListener != null) { mListener.onPreExecute(); } super.onPreExecute(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); if(mListener != null) { mListener.onPostExecute(); } isTaskRunning = false; if(mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); mProgressDialog = null; } } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if(mListener != null) { mListener.onProgressUpdate(values[0]); } } @Override protected void onCancelled() { super.onCancelled(); if(mListener != null) { mListener.onCancelled(); } } } //Listener to notify for async task callbacks public interface AsyncTaskListener{ void onPreExecute(); void onPostExecute(); void onCancelled(); void onBackground(); void onProgressUpdate(int progress); } }
LoginActivity
public class MainActivity extends AppCompatActivity implements AsyncFragment.AsyncTaskListener{ private static final String FRAGMENT_TAG = "asyncFragment"; private static final String TAG = "MainActivity"; private AsyncFragment mAsyncFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FragmentManager fm = getSupportFragmentManager(); mAsyncFragment = (AsyncFragment) fm.findFragmentByTag(FRAGMENT_TAG); if (mAsyncFragment == null) { //fragment was retained during orientation change mAsyncFragment = new AsyncFragment(); fm.beginTransaction().add(mAsyncFragment, FRAGMENT_TAG).commit(); } } @Override public void onPreExecute() { Log.d(TAG, "onPreExecute: "); } @Override public void onPostExecute() { Log.d(TAG, "onPostExecute: "); } @Override public void onCancelled() { Log.d(TAG, "onCancelled: "); } @Override public void onBackground() { Log.d(TAG, "onBackground: "); } @Override public void onProgressUpdate(int progress) { Log.d(TAG, "onProgressUpdate: "); }
¿Has probado esto?
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize"> </activity>
De esta manera la actividad no será recreada. Pero puede detectar la orientación de la pantalla utilizando onConfigurationChanged()
- ¿Existe una alternativa a NestedScrollView para su uso con un WebView?
- ¿Se reutilizan los valores "exclusivos" de Android de Calendars._ID si se elimina remotamente el calendario?