Skocz do zawartości
foregare

Save - Zapamiętanie ostatnio odwiedzonej activity

    Rekomendowane odpowiedzi

    Witam, od razu przedstawię problem, który jak na stan mojej wiedzy jest nie do przeskoczenia w pojedynkę, a którego rozwiązanie dla o wiele świetlejszych uczestników forum będzie pewnie bardzo proste. Startuję z aktywności act_2_2_menu, w której są dwie opcje rozpocznij i kontynuuj. Przyciśnięcie przycisku rozpocznij przenosi nas do aktywności act_2_3, która można powiedzieć jest aktywnością rozpoczynającą. Z tej aktywności przenosimy się naciskając jedyny możliwy do naciśnięcia klawisz do aktywności act_2_4 (dla przejrzystości sytuacji nie podaję kolejnych aktywności, w realu będą kolejne). Natomiast naciśnięcie klawisza kontynuuj, ma nas przenieść do aktywności, na której ostatnio znajdowaliśmy się, gdy podjęliśmy decyzję o wyjściu z programu. I Teraz pytanie, zadam je jak typowy laik: jak to zrobić, żeby zapisywały się do shared preferences dane danej aktywności właściwe tylko dla niej, po wejściu do niej, i jak zrobić, żeby te dane z tej aktywności determinowały później po uruchomieniu programu i naciśnięciu buttonu kontynuuj, że program przeniesie nas do ostatnio oglądanej aktywności. Poniżej przedstawiam fragmenty kodu, gdzie powstawiałem shared preferences intuicyjnie i gdzie stawiam znaki zapytania w metodzie switch w pierwszej z activity, dla zobrazowania momentu, w którym się zawiesiłem. Czy ktoś mógłby pomóc kawałkiem kodu i podsunąć jakieś rozwiązanie ? Chodzi o taki prosty rodzaj save`a. Dziękuję z góry za pomoc.

    AKTYWNOŚĆ act_2_2 menu

    public class act_2_2_menu extends AppCompatActivity implements View.OnClickListener {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_act_2_2_menu);
            TextView okienko = (TextView) findViewById(R.id.okienko) ;
            okienko.setText("Należy dokonać wyboru");
            Button rozpocznij = (Button) findViewById(R.id.rozpocznij);
            Button kontynuuj = (Button) findViewById(R.id.kontynuuj);
            rozpocznij.setOnClickListener(this);
            kontynuuj.setOnClickListener(this);
        }
        public void onClick(View view) {
            Intent intent;
            switch (view.getId()) {
                case R.id.rozpocznij:
                    intent = new Intent(act_2_2_menu.this, act_2_3.class );
                    startActivity(intent);
                    break;
                case R.id.kontynuuj:
                    intent = new Intent(act_2_2_menu.this, ????????????);
                    startActivity(intent);
                    break;
            }
        }
    }
     

    AKTYWNOŚĆ act_2_3

     
    public class act_2_3 extends Activity implements View.OnClickListener {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_act_2_3);
            TextView okienko_2_3 = (TextView) findViewById(R.id.okienko_2_3) ;
            okienko_2_3.setText("To jest początek");
            Button button_2_3 = (Button) findViewById(R.id.button_2_3);
            button_2_3.setOnClickListener(this);
        }
        private void SavePreferences(String value){
            SharedPreferences preferences==PreferenceManager.getDefaultSharedPreferences(this);
            SharedPreferences.Editor editor=preferences.edit();
            editor.putString("act_2_3");
            editor.commit();
        }
        public void onClick(View view) {
            Intent intent;
            switch (view.getId()) {
                case R.id.button_2_3:
                    intent = new Intent(act_2_3.this, act_2_4.class );
                    startActivity(intent);
                    break;
            }
        }
    }
    

    AKTYWNOŚĆ act_2_4

    public class act_2_4 extends Activity { 
    @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_act_2_4); 
    TextView okienko_2_3 = (TextView) findViewById(R.id.okienko_2_4) ; 
    okienko_2_3.setText("To jest kolejna aktywność"); 
    
    private void SavePreferences(String value){ 
    SharedPreferences preferences==PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor=preferences.edit(); editor.putString("act_2_4"); editor.commit(); 
    } 
    }

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Witam,  podbijam temat. Generalnie mam problem z ogarnięciem samego Shared Preferences. Jeżeli mógłby ktoś pomóc, niezależnie od kodu powyżej, i podać przykład jak spowodować zapisanie danych do Shared Preferences w jednej aktywności. Dokładniej - dana aktywność uruchamia się i automatycznie do shared preferences zapisują się wtedy (wraz z tą chwilą) jakiekolwiek dane, pod jedną zmienną tylko. Przykładowo, uruchamia się activity "act_2_4", to dane te będą miały postać "24" i nadpisują one zmienną  w shared preferences. I druga rzecz o którą mi chodzi, to podłączenie do metody switch, żeby w menu głównym po naciśnięciu "kontynuuj" pobrały się aktualne dane z shared preferences i determinowały to, do której aktywności się przeskoczy. Podobny temat założyłem już w tym dziale wcześniej i dostałem pewne wskazówki, ale bez choćby przykładowego kodu tego nie przeskoczę. Dlatego będę wdzięczny za naprowadzenie chociaż częściowe. Dziękuję z góry.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Dzięki, za odpowiedź, spróbowałem dowiedzieć się czegoś z Twojego linka i jeszcze kolejnych, i powiedzmy że temat Shared Preferences jeżeli o zapisywanie i odczytywanie danych ogarniam, został tylko jeden element, ale po kolei. Poniżej kawałki kodu:

     

    Ten zawiera się w aktywności, z której chcę pobrać jej nazwę. Aktywność nazywa się "jav_c1" i taką też nazwę przekazuję do Shared Preferences. Każda z kolejnych aktywności zawiera taki wpis, tyle że ma swoją nazwę czyli "jav_c2" , "jav_c3"  itd. Przechodzę między nimi butonami.

     


     

    SharedPreferences myPreferences = getSharedPreferences("plik",MODE_PRIVATE);
    
    SharedPreferences.Editor myEditor = myPreferences.edit();
    
    myEditor.putString("wiad", "jav_c1");
    
    myEditor.commit();
    

    Ten kawałek kodu zawiera się w moim menu głównym. Okienko textView stworzyłem, żeby sprawdzić poprawność działania przechodzenia danych w ramach Shared Preferences i wszystko działa. Nazwa aktywności, w której ostatnio byłem, zanim wyłączyłem całą aplikację, pojawia się w specjalnie stworzonym do tego okienku w menu głównym, a więc jest przekaz danych tak jak chciałem.

     

     

    TextView textView6 = (TextView) findViewById(R.id.textView6);
    
    SharedPreferences myPreferences = getSharedPreferences("plik",MODE_PRIVATE);
    
    String info = myPreferences.getString("wiad", "");
    
    textView6.setText (info);
    
    

    I teraz miejsce, w którym się zatrzymałem. Mam zaimplementowane klawisze, pierwszy zaprowadzi nas do pierwszej aktywności, no a drugi, wypadałoby żeby skorzystał jakoś z tego stringa o nazwie info który ma w sobie nazwę tej ostatniej odwiedzonej aktywności. Pytanie, co tam wpisać, gdzie są te znaki zapytania?

     

    public void onClick(View view) {
    
    Intent intent;
    
    switch (view.getId()) {
    
    case R.id.butpocz:
    
    intent = new Intent(menu.this, jav_c1.class);
    
    startActivity(intent);
    
    break;
    
    case R.id.butnowe:
    
    intent = new Intent(menu.this, ????????????);
    
    startActivity(intent);
    
    break;
    
    
    }

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    mmaciejow

    Wstaw klasę która odpowiada za start aplikacji, czy "od nowa" cokolwiek to znaczy. A jeżeli to ma być klasa ta w której masz napisany kod to po prostu nie rób intencji i wyjdź ze switch.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Nazwa tego drugiego butona może być myląca. On ma wywołać ostatnio otwarte activiti. Opanowane mam zapisanie ostatnio otwartego activiti do shared preferences, wyświetla mi się nazwa w okienku menu głównego tego ostatniego activity i tu wszystko gra, tylko jak podłączyć pod klawisz te dane z shared preferences z informacją o nazwie ostatnio otwartego activity, żeby wywołał on to właśnie activity, czyli podaję może jeszcze raz ten kawałek kodu z klawiszami ze zmienioną nazwą tego drugiego, żeby nie mylił

     

    public void onClick(View view) {
    
    Intent intent;
    
    switch (view.getId()) {
    
    case R.id.butpocz:
    
    intent = new Intent(menu.this, jav_c1.class);
    
    startActivity(intent);
    
    break;
    
    case R.id.butostatniootwarte:
    
    intent = new Intent(menu.this, ????????????);
    
    startActivity(intent);
    
    break;
    
    
    }

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Chcąc jeszcze bardziej uprościć pytanie - jak w poprawny sposób umieścić nazwę activity w intencie zawierającym się w metodzie switch w linijce: 

     

    intent = new Intent(menu.this, ????????????);

     

    która to nazwa jest zapisana w zmiennej string, która to zmienna pobrała ją z shared preferences. Jak tam gdzie pytajniki wpisuję nazwę stringa i po kropce ".class" to jest oczywiście błąd, i nie wiem jak to ugryźć. Zawartość stringa ciągle się zmienia w zależności od activity na której zakończyłem działanie programu, tak więc nie można w miejsce pytajników wpisać konkretnej activity. Jakieś sugestie :) ?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Póki co dotarłem do takiego rozwiązania:

     

    public void onClick(View view) { Intent intent; switch (view.getId()) { case R.id.butpocz: intent = new Intent(menu.this, jav_c1.class); startActivity(intent); break; case R.id.butostatniootwarte: try
                { Class<?> lastActivity = Class.forName(info); intent = new Intent(menu.this, lastActivity); startActivity(intent); break; } catch (ClassNotFoundException e) { textView6.setText ("błąd"); break; }

     

    I po takim rozwiązaniu nie wywala mi żadnych błędów przy starcie. W sensie, że nic nie świeci się na czerwono i program startuje normalnie. Nazwa activity ostatnio otwartego zapisuje się do shared preferences, ta przekazuje dane do stringa o nazwie "info" i ten pokazuje nazwę activity, które było ostatnio otwarte w okienku specjalnie stworzonym żeby sprawdzić poprawność wykonywania programu do tego momentu. Podpinając do drugiego buttona "butostatniootwarte" catch/try wpisując w Class.forName nazwę tego stringa, który przechowuje nazwę ostatnio otwartego activity, nie wywala żadnych błędów. No ale po starcie programu i upewnieniu się, że jest zapisana nazwa ostatniej activity w "info", gdy przycisnę  "butostatniootwarte", to program jakby uruchamia się od początku. Jakieś sugestie choćby ???

     

    Witam. Może się to komuś przyda. Podaję rozwiązanie problemu. A więc, w aktywnościach, które chcemy, by mogły być przywoływane później w menu głównym wciśnięciem buttonu np. "wczytaj ostatnią aktywność", zapisujemy ich nazwę w shared preferences. Czyli np.

     

    SharedPreferences myPreferences = getSharedPreferences("file",MODE_PRIVATE);
            SharedPreferences.Editor myEditor = myPreferences.edit();
            myEditor.putString("key", getClass().getName());
            myEditor.commit();

     

    Zwróćcie uwagę na użycie getClass().getName() , co upraszcza nam wpisanie nazwy Aktywności do shared preferences i gwarantuje,  że zapisana ona zostanie w poprawny sposób, bez literówek.

     

    Następnie w głównym menu (i tutaj głównie popełniałem mój błąd) przywołujemy shared preferences ale w samej metodzie onClick, a nie w onCreate (jak robiłem to do tej pory). Poza tym, niezbędne będzie użycie try/catch. Czyli ma to mieć postać:

     

    public void onClick(View view) {
    
            Intent intent;
            switch (view.getId()) {
                case R.id.buttonpoczatek:
                    Intent a = new Intent(menu.this, aktywnoscstartowa.class);
                    startActivity(a);
                    break;
                case R.id.buttonostatniootwarte:
                    SharedPreferences myPreferences = getSharedPreferences("file", MODE_PRIVATE);
                    String wgraj = myPreferences.getString("key", "");
                    Class<?> ostatniaaktywnosc;
                    try {
                        ostatniaaktywnosc = Class.forName(wgraj);
                        Intent b = new Intent(menu.this, ostatniaaktywnosc);
                        startActivity(b);
                        break;
                    } catch (ClassNotFoundException e) {
                        textView6.setText("błąd");
                        break;

     

    Testowałem na kilku aktywnościach, w tej którą chciałem, by mogła być przywoływana jako ostatnio otwarta, uruchamiałem shared preferences, żeby zapisało jej nazwę. Każde przejście do innej aktywności nadpisywało shared preferences uaktualniając dane o ostatnio otwartej aktywności. W menu głównym te dane shared preferences były wpisywane do stringa, a string był wykorzystywany w switch połączonym z catch/try, tak jak jest powyżej.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x