Jak działa intent oraz new Intent w tym kodzie?

0

Witajcie,

zastanawiam się jak po kolei egzekwuje się ten kod


public class QuizActivity extends AppCompatActivity {
    
     private Button mCheatButton;
     
      mCheatButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

               boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
               Intent intent = CheatActivity.newIntent(QuizActivity.this,answerIsTrue);
                startActivity(intent);
            }
        });
        
        
//oraz druga klasa

public class CheatActivity extends AppCompatActivity {

    private static final String EXTRA_ANSWER_IS_TRUE = "geoquiz.answer_is_true";
    private boolean mAnswerIsTrue;


    public static Intent newIntent (Context packageContext, boolean answerIsTrue){
        Intent intent = new Intent(packageContext, CheatActivity.class);
        intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue);
        return intent;
    }

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


        mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false);
    }
}



Wiem tylko, że

nr1. boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue(); - klasa Quiz przekazuje odpowiedzi na bieżące pytania.

a dalej?

0

W klasie QuizActivity jest tworzony onClickListener na przycisku mCheatButton, który sprawia, że jak klikniesz button to:

  1. Jest wołana metoda statyczna newIntent z klasy CheatActivity.
Intent intent = CheatActivity.newIntent(QuizActivity.this,answerIsTrue);
  1. W tej metodzie jest tworzony nowy obiekt Intent czyli spolszczając: jest tworzona intencja wywołania nowego okienka.
public static Intent newIntent (Context packageContext, boolean answerIsTrue){
        Intent intent = new Intent(packageContext, CheatActivity.class);
  1. Do tej intencji jest przekazana dodatkowa informacja o tym czy odpowiedź jest poprawna za pomocą metody putExtra.
intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue);
  1. Następnie metoda zwraca obiekt intencji return intent.
return intent;
  1. Na koniec za pomocą otrzymanej intencji jest uruchamiane nowe Activity czyli nowe okno: startActivity(intent). W którym to okienku jest pokazywana podpowiedź dla użytkownika
startActivity(intent);

P.S.
Wiem, że ten przykład pochodzi z książki Android Programming: The Big Nerd Ranch Guide. Czy masz tę książkę w wersji polskiej? Czy czytasz ją, czy tylko przeglądasz kody źródłowe? W książce masz wszystko od A do Z wyjaśnione co się dzieje. Jeżeli masz wersję angielską i nie rozumiesz treści książki, to zainwestuj te kilkadziesiąt złotych i kup polską wersję. Poza tym zastanawiam się czy masz jakąś książkę do Javy? Jeżeli nie będziesz miał podstaw Javy, to będziesz miał nagminnie problemy ze zrozumieniem przykładów.

0

Haskell,
zanim odpowiem dopisz proszę jeszcze o boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();

Czy ta linijka kodu bierze pod uwagę ten drugi argument z tej tablicy Question - np. new Question(R.string.question_australia, true), ?
Czy wartość answerIsTrue jest przekazywana do linijki niżej czyli - Intent intent = CheatActivity.newIntent(QuizActivity.this,answerIsTrue);?

0

Do zmiennej answerIsTrue przepisz wynik metody isAnswerTrue() wykonanej na obiekcie znajdującym się w kolekcji mQuestionBank na pozycji mCurrentIndex:

boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue()

Metoda isAnswerTrue zwraca po prostu wartość pola mAnswerTrue. Jeżeli tam jest true, to zwraca true i tyle.

Czy ta linijka kodu bierze pod uwagę ten drugi argument z tej tablicy Question - np. new Question(R.string.question_australia, true), ?

To nie jest tablica. Kod new Question(R.string.question_australia, true) tworzy nowy obiekt klasy Question przekazując do konstruktora treść pytania w pierwszym parametrze oraz ustawia wartość pola mAnswerTrue w drugim parametrze.

Masz przecież wyraźnie napisane, że do metody newIntent są przekazywane dwa parametry. Pierwszy to QuizActivity.this czyli obiekt klasy QuizActivity w którym wykonuje się ten kod oraz answerIsTrue czyli zmienna, która została ustawiona powyżej.

Intent intent = CheatActivity.newIntent(QuizActivity.this,answerIsTrue);
0

Ok, ale mam ten kod..


 private Question[] mQuestionBank = new Question[] {
            new Question(R.string.question_australia, true),
            new Question(R.string.question_oceans, true),
            new Question(R.string.question_mideast, false),
            new Question(R.string.question_africa, false),
            new Question(R.string.question_americas,true),
            new Question(R.string.question_asia, true),
    };

I teraz ten kod


boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue()

dostarcza informację tylko o tych true? No bo jeśli za każdym razem zwróci answerIsTrue to przecież nie jest to prawdą bo tam też jest false.

Ależ się już pogubiłem.. :(

Update:
Znalazłem dalej


private boolean mAnswerIstrue;

....

mAnswerIsTrue = getIntent().getBooleanExtra (EXTRA_ANSWER_IS_TRUE, false)

czyli najpierw czytany jest kod getIntent...i gdy tam nie ma odnalezionej wartości true ,wykonuje się getBooleanExtra i przypisuje wartość domyślną false?

Ech, chyba nie tak :( .Ja pierdziu. Już nic nie wiem.

0
Kubs napisał(a):

boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue()

dostarcza informację tylko o tych true? No bo jeśli za każdym razem zwróci answerIsTrue to przecież nie jest to prawdą bo tam też jest false.

Masz dramatyczne braki, jeżeli chodzi o Javę. Musisz nauczyć się Javy, jeżeli zamierzasz dalej brnąć z Androidem. answerIsTrue to tylko nazwa metody, która zwraca true albo false w zależności od tego co masz w obiekcie.

Ależ się już pogubiłem.. :(

Update:
Znalazłem dalej

private boolean mAnswerIstrue;
....
mAnswerIsTrue = getIntent().getBooleanExtra (EXTRA_ANSWER_IS_TRUE, false)

czyli najpierw czytany jest kod getIntent...i gdy tam nie ma odnalezionej wartości true ,wykonuje się getBooleanExtra i przypisuje wartość domyślną false?

Nie! W ogóle nie rozumiesz co to jest Intent. Czytałeś tę książkę w ogóle? Obawiam się, że ani nie czytałeś książki albo jej nie rozumiesz, ani nie rozumiesz w ogóle kodu, który masz przed oczami. To jest pierwsza, najprostsza aplikacja z tej książki. Jak zamierzasz iść dalej, jeżeli już teraz masz takie problemy?

getIntent() zwraca obiekt intencji. Intencji którą jest pokazanie podpowiedzi użytkownikowi. W tej intencji wcześniej umieściliśmy wartość o nazwie "EXTRA_ANSWER_IS_TRUE" która zawiera true albo false. Metoda getBooleanExtra pobiera z obiektu intencji wartość, a jeżeli jej nie znajdzie wstawia false. W praktyce w tym kodzie zawsze będziesz miał tą wartość EXTRA, ponieważ zawsze uruchamiasz akcję podpowiedzi wcześniej pakując do intencji true lub false.

0
Haskell napisał(a):

Do zmiennej answerIsTrue przepisz wynik metody isAnswerTrue() wykonanej na obiekcie znajdującym się w kolekcji mQuestionBank na pozycji mCurrentIndex:

boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue()

Metoda isAnswerTrue zwraca po prostu wartość pola mAnswerTrue. Jeżeli tam jest true, to zwraca true i tyle.

Haskell ,skąd tu się bierze ta metoda isAnswerTrue()? I jak ona w ogóle zwraca wartość pola mAnswerTrue? Gdzie ta metoda i to pole są powiązane w kodzie?

Tak, czytam cały czas tą książkę (wersja polska) ale jak mam tekst typu - "aby poinformować intencję musisz przekazać następującą wartość":


mQuestionBank[mCurrentIndex].isAnswerTrue()

po prostu zastanawiam się skąd im się to isAnswerTrue() wzięło.

0

Co do pytania - napisz, jakiego typu obiekt zwraca ten fragment kodu mQuestionBank[mCurrentIndex]. Wtedy będziesz miał odpowiedź, skąd się bierze metoda isAnswerTrue() i w jaki sposób zwraca to, co zwraca.

Poza pytaniem, krótka porada. Myślę, że nauka Androida nie jest na tym etapie dla Ciebie. Patrząc po większości wątkowów, masz problemy ze zrozumieniem absolutnych podstaw programowania. Radziłbym najpierw zabrać się za jakieś aplikacje konsolowe, bo wygląda to trochę jakbyś porywał się z motyką na Słońce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1