Actualmente estoy tratando de crear una aplicación que tiene una pantalla de presentación, una pantalla de inicio de sesión y una pantalla de registro.
La única manera de lograr exactamente lo que necesito es a través de fragmentos. Aunque cuando trato de transición de la pantalla de presentación al inicio de sesión fragmentar la vista de texto que fue parte de los restos pantalla de presentación. Lo mismo sucede después de la transición a partir del fragmento de inicio de sesión al fragmento de registro, así como de la parte posterior fragmento de registro al fragmento de inicio de sesión. Es importante tener en cuenta que no hay ningún problema durante la transición entre la entrada y el registro o entre registro y login - excepto el hecho de que las estancias de edición de texto allí.
Mi MainActivity.java
public class StartActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
}
@Override
public void onBackPressed(){
Toast.makeText(getApplicationContext(), "Back button is disabled", Toast.LENGTH_SHORT).show();
}
}
Mi diseño para MainActivity
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".StartActivity"
android:background="@mipmap/background">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewpagerstart"
android:layout_centerInParent="true"
android:name="com.example.distributedsystemsui.SplashFragment">
</fragment>
</RelativeLayout>
los SplashScreen.java
public class SplashFragment extends Fragment {
LinearLayout linearLayout;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_splash, container, false);
linearLayout = (LinearLayout) view.findViewById(R.id.f_linearsplash);
Animation animation_fadein = AnimationUtils.loadAnimation((StartActivity)getActivity(), R.anim.fade_in);
linearLayout.startAnimation(animation_fadein);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_enter_left, R.anim.slide_exit_left,
R.anim.slide_enter_right, R.anim.slide_exit_right);
LoginFragment loginFragment = LoginFragment.newInstance();
ft.replace(R.id.viewpagerstart, loginFragment);
ft.commit();
}
}, 3000);
return view;
}
}
Y la disposición para el SplashScreen
fragmento.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginFragment"
android:background="@color/Tranparent"
android:id="@+id/frame_splash">
<LinearLayout
android:id="@+id/f_linearsplash"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/f_splashlogo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="70dp"
android:background="#FFFFFF"/>
<TextView
android:id="@+id/f_splashtext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:layout_gravity="center_horizontal"
android:layout_marginTop="100dp"
android:background="#FFFFFF"/>
</LinearLayout>
</FrameLayout>
Todo mi búsqueda de nuevo a nada condujo.
Sólo puedo suponer que, o bien el siguiente contenido en el MainActivity.xml crea una confusión (que he intentado cambiar pero no hubo suerte):
android:name="com.example.distributedsystemsui.SplashFragment"
o que estoy haciendo un error en el SplashScreen.java
que no puedo localizar, a pesar de que he intentado durante más de 5 horas para hacer que funcione.
El problema es que no se puede reemplazar fragmentos añadidos a través de la <fragment>
etiqueta.
En su lugar, o bien debe:
1) Cambiar a FragmentContainerView
, que se añadió en Fragmento1.2.0
. No sufre del mismo problema que la <fragment>
etiqueta y le permite hacer replace
operaciones sin problemas:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".StartActivity"
android:background="@mipmap/background">
<androidx.fragment.app.FragmentContainerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewpagerstart"
android:layout_centerInParent="true"
android:name="com.example.distributedsystemsui.SplashFragment">
</androidx.fragment.app.FragmentContainerView>
</RelativeLayout>
2) Utilizar una FrameLayout
en su diseño y añadir manualmente el SplashFragment
en su actividad (esto es esencialmente lo FragmentContainerView
hace por usted):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".StartActivity"
android:background="@mipmap/background">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewpagerstart"
android:layout_centerInParent="true">
</FrameLayout>
</RelativeLayout>
Lo que significa que hay que añadir el SplashFragment manualmente:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.viewpagerstart, new SplashFragment())
.commit()
}
}