Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - srWhiteSkull

#31
Todo eso es lo mismo que le expliqué en la publicación. Como puedes apreciar el fragmento B sigue vivo y posiblemente el resto de fragmentos. De esa forma cuando usted haga BACK volverá al fragmento que hay debajo.
#32
Bueno, el caso es que puedes probar implementarlo mediante CSV si no es muy ambiciosa, y por otro lado si usas programación orientada a objetos crearte una clase, que si en un futuro se desea implementar otro tipo de base de datos pues simplemente te pones a ello.

Aplicación -> Clase DATOS -> Clase CSV, Clase MySQL, Clase Access

Yo lo haría así. Pero si hay algo escrito en el manual del buen programador no lo se.

Suerte.



#33
Depende, cual es la magnitud? Son millones de registros? Cada cuanto tiempo rondan las operaciones? Pues en base a un previo estudio de las necesidades del programa usarás esto o aquello, desde el sencillo CSV en texto plano, pasando por Access, DB2 basada en XML, motores SQL, etc..
#34
Los elementos que comienzan por R indican que son recursos estáticos. Eso significa que ya están creados y definidos en el proyecto. En el caso que te puse de ejemplo, no era para que hicieras un copy/paste, algo que deberías entender si vas a dedicarte a la programación.

Lo siguiente que te voy a mostrar, es un ejemplo más sencillo, pero no es para que hagas copy/paste, es para que asimiles el funcionamiento del proceso de transacción o reemplazo de fragmentos evitando el solapamiento de éstos al retroceder por medio del botón BACK del sistema.

Para que asimiles esto estudia el código y prueba comentar la línea de la función cambiaFrame() del Activity, getSupportFragmentManager().popBackStack(), que es la encargada de sacar el fragmento que se encuentra apilado y que aunque la transacción lo reemplaza en verdad permanece vivo en la aplicación. Verás también, en la consola de depuración, como el resultado de Fragmentos Apilados se incrementa según invoques los fragmentos al pulsar los botones Fragmento A y Fragmento B cuando dicha línea esté comentada pero cuando la línea no está comentada el apilamiento será siempre 1.

Normalmente cuando pulsas la tecla BACK del sistema en la actividad tenderá a volver hacia atrás, si no hay nada en la pila volverá al escritorio pero si existen fragmentos vivos en la pila irá haciendo pop liberando en cada pulsación cada fragmento. Esto lo verás al comentar la susodicha línea. Fíjate en la consola de depuración.

Recursos

Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:background="#F44336"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_weight=".15"
        android:background="#00BCD4"
        android:orientation="horizontal"
        android:layout_height="0dp">

        <Button
            android:id="@+id/llamaFragmentoA"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Fragmento A" />

        <Button
            android:id="@+id/llamaFragmentoB"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="Fragmento B" />
    </LinearLayout>

    <FrameLayout
        android:id="@+id/contenedor"
        android:layout_width="match_parent"
        android:layout_weight=".85"
        android:layout_height="0dp">

    </FrameLayout>
</LinearLayout>


Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_weight=".50"
            android:gravity="center"
            android:text="Fragmento A"
            android:layout_height="0dp" />

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight=".50"
            android:background="#4CAF50">

            <EditText
                android:id="@+id/editText"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:ems="10"
                android:gravity="center"
                android:inputType="textPersonName"
                android:text="A"
                android:textSize="200dp" />
        </FrameLayout>

    </LinearLayout>
</FrameLayout>


Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight=".50"
            android:background="#FF9800">

            <EditText
                android:id="@+id/editText"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:ems="10"
                android:gravity="center"
                android:inputType="textPersonName"
                android:text="B"
                android:textSize="200dp" />
        </FrameLayout>

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_weight=".50"
            android:gravity="center"
            android:text="Fragmento B"
            android:layout_height="0dp" />

    </LinearLayout>
</FrameLayout>


Codigo

Hay que añadir a cada clase el package con el nombre correspondiente que le hayas dado al proyecto.

Código (java) [Seleccionar]
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.llamaFragmentoA).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("Evento","Frgamento A");
                cambiaFrame("A",new FragmentoA());
            }
        });

        findViewById(R.id.llamaFragmentoB).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("Evento","Frgamento B");
                cambiaFrame("B",new FragmentoB());
            }
        });
    }

    public void cambiaFrame(String nombre, Fragment fragmento){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        int numFragmentos = getSupportFragmentManager().getBackStackEntryCount();
        Log.d("Frame","Fragmentos Apilados = "+numFragmentos);
        if (numFragmentos>=1){ // Comprobamos la pila, y si existen más Fragments dentro entonces...
            // Comenta esta linea y compara el resultado sin comentar esta linea, cual es la conclusión?
            getSupportFragmentManager().popBackStack(); // Sacamos el de atrás de la pila (creo que era para evitar que cuando pulsaras el botón BACK volvieras a la vista anterior)

            ft.replace(R.id.contenedor, fragmento); // y reeplazamos
            ft.addToBackStack(nombre); // Le ponemos un nombre a ese Fragment

        } else {
            ft.add(R.id.contenedor, fragmento); // En caso de no existir ninguno simplemente añadimos
            ft.addToBackStack(nombre);
        }
        ft.commit();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        int numFragmentos = getSupportFragmentManager().getBackStackEntryCount();
        Log.d("Frame","Haciendo Pop, fragmentos apilados = "+numFragmentos);

    }
}


Código (java) [Seleccionar]
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
* A simple {@link Fragment} subclass.
*/
public class FragmentoA extends Fragment {


    public FragmentoA() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragmento_a, container, false);
    }

}


Código (java) [Seleccionar]
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
* A simple {@link Fragment} subclass.
*/
public class FragmentoB extends Fragment {


    public FragmentoB() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragmento_b, container, false);
    }

}


Este sistema permite solucionar el problema que tienes pero como indica la doc en Apis iguales o superiores a la 28 se debe prescindir del FragmentManager, aconsejando tener en cuenta el ciclo de vida.
#35
En el activity :
Código (java) [Seleccionar]

   public void cambiaFrame(String nombre, Fragment fragmento){
       esPrincipal=false;
       FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
       if (getSupportFragmentManager().getBackStackEntryCount()>=1){ // Comprobamos la pila, y si existen más Fragments dentro entonces...
           if (getSupportFragmentManager().getFragments().get(1).getClass()!=fragmento.getClass()) {
               getSupportFragmentManager().popBackStack(); // Sacamos el de atrás de la pila (creo que era para evitar que cuando pulsaras el botón BACK volvieras a la vista anterior)
               ft.replace(R.id.fragment, fragmento); // y reeplazamos
               ft.addToBackStack(nombre); // Le ponemos un nombre a ese Fragment
           }
       } else {
           ft.add(R.id.fragment, fragmento); // En caso de no existir ninguno simplemente añadimos
           ft.addToBackStack(nombre);
       }
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       getSupportActionBar().setDisplayShowHomeEnabled(true);
       findViewById(R.id.boton_sms).setVisibility(View.INVISIBLE);
       ft.commit();
   }


PD También podrías hacerlo invisible o destruirlo, al de atrás, prueba eso también si este código no te sirve.

Resto del código :
https://github.com/RufusWein/proyecto-fin-curso/blob/master/Cliente%20Android%20con%20Pasarela%20SMS/StudentManager/app/src/main/java/tk/srwhiteskull/studentmanager/ActividadPrincipal.java
#36
Siento el doble post, pero viendo el código que has puesto creo que vas encaminado, prueba usar el método remove(FragmentoAnterior) y luego aplicar el reaplce(nuevoFragmento) o el add(NuevoFragmento).

PD Voy a echar un vistazo a algo que tenga por ahí.
#37
No, me refiero hacer un pop, un pop es sacar el Fragment. Supuestamente los Fragment o las vistas se van apilando y existe un gestor que te indiqué en el enlace y que en la documentación recomiendan no usarlo por obsolescencia. Este gestor de fragmentos tiene funciones para sacar el último Fragment, y combinándolo con otro objeto que ya ni me acuerdo, recuerdo que podías hacer transiciones entre Fragments. La verdad es que no estoy muy puesto al día pero si recuerdo el problema que comentas.

En teoría según la doc debes evitar usar el sistema comentado y atenerte al ciclo de vida del Fragment por lo que sugiero que pruebes usar el método onDestroy() con el Fragment que se queda atrás, y para ello debes conservar de alguna manera su "referencia".

Quizás si no entiendes los términos descritos aquí lo que necesitas es más práctica y experiencia con la programación del Api de Android. Si no quieres destrozar el proyecto que tienes con experimentos te aconsejo que crees nuevos proyectos de prueba y cuando entiendas todo eso lo apliques al proyecto que tienes entre mano.

Suerte
#38
Tienes que hacerle un pop al contenedor o gestor de Fragments. Hace tiempo qeu no trabajo con Android pero creo que era con ésto :

https://developer.android.com/reference/android/app/FragmentManager.html

Investiga

PD O guarda la referncia del anterior y hazle un onDestroy(), porque por lo que veo lo que te puse está deprecated.
#40
Qués es una caché? Ficheros.

Por ejemplo te bajas una imagen llamada "perfil". Pues lo único que haces es volcar esa imagen a un fichero, "perfil.jpg". Luego en la siguiente inicialización antes de bajarte la imagen compruebas si existe "perfil.jpg", de ser así la cargas como un fichero normal y pasas esa imagen al componente drawable pertinente.

Aunque en apariencia puede parecer sencillo hay bastante complejidad. Yo para evitar que se detuviera la aplicación disponía de una clase que hacía ésto y que procesaba en un hilo, por lo que podían lanzarse muchísimos hilos a la vez, uno detrás de otro, con la suerte de que tenían un tiempo de vida de unos pocos segundos o menos dependiendo de la imagen. Se consumían recursos pero luego se liberaban.

Posiblemente existan librerías de terceros que hagan lo mismo pero muchas veces me gusta reinventar la rueda y hacerlo todo por mi cuenta, al fin y al cabo la clase sólo me supuso como 200 líneas de código.