Jak przekazać button (typ View) używając intent i bundle.

Odpowiedz Nowy wątek
2017-11-26 12:51

Rejestracja: 3 lata temu

Ostatnio: 10 miesięcy temu

0

Witajcie,

jak przekazać wartość typu View (button) ,co na razie udało mi się w warunku If


if (isAllAnswered) {
                    boolean isGoodAnswer = checkAnswers();
                    Toast.makeText(getApplicationContext(), "isGoodAnswer value is: " + isGoodAnswer, Toast.LENGTH_SHORT).show();

                    if (isGoodAnswer) {
                        intent.putExtra("KEY_ANSWER", "Good Answer");
                        intent.putExtra("KEY_BUTTON", mapButton.getId());   //Ta linia kodu
                    }

do tej klasy


public class AnswerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_answer);
        TextView textViewDisplayResult = (TextView) findViewById(R.id.text_view_display_result);

        String answer = "";
        Bundle bundle = getIntent().getExtras();

        if (bundle != null) {
            if (bundle.containsKey("KEY_ANSWER"))
                answer = bundle.getString("KEY_ANSWER");
                int mapButton = bundle.getInt("KEY_BUTTON");  // Coś tu kombinuje ale nie wychodzi

Chce uzyskać taki efekt (załącznik).

Pozostało 580 znaków

2017-11-26 15:08

Rejestracja: 4 lata temu

Ostatnio: 10 godzin temu

2

A nie lepiej jest po prostu mieć ten button w tym layout xml z visibility=invisible / gone, oraz ustawionym jakimś @+id?
I w momencie, gdy spełniony jest tam warunek jaki tam chcesz, zmienić widoczność? Pamiętaj, że jeśli dodajesz programistycznie nowy widget do swojego głównego View ( button do view aktywności), to musisz też ustawić ręcznie wszystkie LaytouParams ( width/height, aligment, constraint, text itp)...

To co napiszę tutaj nie powinno być przyjmowane za pewnik, bo pomysł jaki tu przedstawiłeś nigdy nie przyszedł mi do głowy ( przerzucanie gotowego widgetu pomiędzy aktywnościami/fragmentami, zamiast wzięcia danych i zrobienie nowego) i nie jestem pewien tego do końca.
Poprzez Intent Ekstra / Bundle możesz przekazywać typy proste oraz obiekty rozszerzające interfejs Parcelable ( są jeszcze jakieś inne, ale nigdy nie zaprzątałem sobie nimi głowy).
Nie mam pojęcia co znajduje się w twoim mapButton, jakiego rodzaju id, ale jeśli jest to id z view.getId(), to zmartwię cię, bo o ile dobrze pamiętam to są to wartości 0, 1, 2... ( tego właśnie nie jestem pewien, bo tylko w debuggerze to widziałem), bo znajdują się one w zakresie GroupView rodzica ( w tym przypadku np. masz fragment1 i w nim button, tak więc button należy do GroupView fragment1), i system nie ma potrzeby przypisywania im jakichś fikuśnych id 4390431990219302190321.
Żeby uzyskać unikalne id dla view.getId(), musiałbyś generować je ręcznie i przypisać do danego view.

Same próby przerzucania konkretnego view, już utworzonego i przypisanego do danej grupy pomiędzy jedną aktywnąścią/fragmentem a drugim, jest moim zdaniem poroniony, ponieważ te obiekty mają swój cykl życia. Co innego dodawanie nowego widgetu Z WEWNĄTRZ tej aktywności/fragmentu, po tym, gdy już uzyskasz na jego temat dane. To jest już w porządku.

Podsumowując:

  • miej go już w xml, ale niewidzialny ( najłatwiej)
  • dodaj go programistycznie i ustaw programistycznie wszystkie parametry ( dłużej, to tylko 1 button więc nie widzę sensu robienia tego, a jakby tych obiektów było od groma ( niekoniecznie buttony:) to jakiś adapter).
Gregoryl, czy mógłbyś proszę jeszcze zerknąć na kolejną stronę tego wątku? Uaktualniłem go o jedno pytanie. Z góry dziękuje. - Kubs 2017-11-30 17:29

Pozostało 580 znaków

2017-11-26 18:08

Rejestracja: 3 lata temu

Ostatnio: 10 miesięcy temu

0

Dziękuje za bardzo obszerne wyjaśnienie. Pozwól, że jeszcze pociągnę temat bo próbuje zrobić to tak jak sugerowałeś. Trochę się zgubiłem i nie wiem co dalej.
Ustawiłem w If w MainActivity

if (isGoodAnswer) {
                        intent.putExtra("KEY_ANSWER", "Good Answer");
                        mapButton.getVisibility() == View.VISIBLE;   // Tutaj

oraz mam xml ale nie wiem gdzie wstawić - w activity_main.xml, czy tam gdzie ma się docelowo wyświetlić czyli w activity_answer.xml?

   <Button
        android:id="@+id/button"
        android:visibility="gone"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/text_view_display_result"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="18dp"
        android:text="" />
edytowany 2x, ostatnio: Kubs, 2017-11-26 18:12

Pozostało 580 znaków

2017-11-26 21:14

Rejestracja: 4 lata temu

Ostatnio: 10 godzin temu

0

Aaa, mapButton to jest "button od mapy" ;). A ja już pomyślałem, że masz tam jakąś mapę buttonów Map<K,V>.

Button wstaw w layout xml w którym ma się wyświetlać.

Do tego activity_answer przekaż sobie co tam chcesz, i to, czy przycisk będzie widoczny czy nie uzależnij sobie już wewnątrz activity_answer od jakiegoś warunku. Tyle.

Jeszcze jedna uwaga, bo może o to tutaj chodzi ( szczerze to ciężko widzieć problem, gdy wstawi się kilka linijek kodu): dla każdego ekranu rób nowy plik layout.xml, praktycznie nigdy nie opłaca się z osiąganie efektu "nowego" ekranu poprzez używanie starego i dodawanie do niego brakujących widgetów programistycznie.

edytowany 1x, ostatnio: GregoryI, 2017-11-26 21:17
Witaj, uaktualniłem moją poniższą odpowiedź do Ciebie o kilka linijek kodu (na samym dole postu). Mam prośbę - czy mógłbyś wyjaśnić mi każdą linijkę z tego kodu? Nie jestem po prostu pewny co tam się dzieje (oprócz tych ostatnich dwóch). Z góry serdecznie dziękuje. - Kubs 2017-11-29 15:10

Pozostało 580 znaków

2017-11-27 09:50

Rejestracja: 3 lata temu

Ostatnio: 10 miesięcy temu

0

Dziękuje za info :)

A czy można ustawić w kodzie MainActivity.java to pojawienie się przycisku 'mapButton' razem z wyświetleniem odpowiedzi 'Good Answer'

buttonCheckAnswer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                boolean isAllAnswered = allAnswersChecked();
                Toast.makeText(getApplicationContext(), "isAllAnswered value is: " + isAllAnswered, Toast.LENGTH_SHORT).show();

                if (isAllAnswered) {
                    boolean isGoodAnswer = checkAnswers();
                    Toast.makeText(getApplicationContext(), "isGoodAnswer value is: " + isGoodAnswer, Toast.LENGTH_SHORT).show();

                    if (isGoodAnswer) {
                        intent.putExtra("KEY_ANSWER", "Good Answer");
                                                                    //Tutaj

                    }
                    else
                        intent.putExtra("KEY_ANSWER", "Wrong Answer");
                } else
                    intent.putExtra("KEY_ANSWER", "You haven't checked all answers");

                startActivity(intent);
            }
        });

i potem ustawić to jakoś w If, w tej klasie gdzie wyświetla się to wszystko?


public class AnswerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_answer);
        TextView textViewDisplayResult = (TextView) findViewById(R.id.text_view_display_result);

        String answer = "";
        Bundle bundle = getIntent().getExtras();

        if (bundle != null) {
            if (bundle.containsKey("KEY_ANSWER"))
                answer = bundle.getString("KEY_ANSWER");
        }

Gregoryl, to ten kod:

String answer= getIntent().getExtras().getString("KEY_ANSWER","");
        Log.e(TAG, "initVariable: answer="+answer);
        if(answer.equalsIgnoreCase("Good Answer")){
            String  anotherButton= getIntent().getExtras().getString("KEY_ANOTHER_BUTTON","");
            Log.e(TAG, "initVariable: another button="+anotherButton );
            textViewDisplayButton.setVisibility(View.VISIBLE);
            textViewDisplayButton.setText(anotherButton);
edytowany 1x, ostatnio: Kubs, 2017-11-29 15:08

Pozostało 580 znaków

2017-11-29 18:08

Rejestracja: 4 lata temu

Ostatnio: 10 godzin temu

0
Kubs napisał(a):

Gregoryl, to ten kod:

String answer= getIntent().getExtras().getString("KEY_ANSWER","");
        Log.e(TAG, "initVariable: answer="+answer);
        if(answer.equalsIgnoreCase("Good Answer")){
            String  anotherButton= getIntent().getExtras().getString("KEY_ANOTHER_BUTTON","");
            Log.e(TAG, "initVariable: another button="+anotherButton );
            textViewDisplayButton.setVisibility(View.VISIBLE);
            textViewDisplayButton.setText(anotherButton);

Reszty nie czytałem.

// Próbujesz pobrać argument który zapewne przekazałeś do rozpoczynanej aktywności. Klucz "KEY_ANSWER", domyślna wartość zwrócona jeżeli nie ma niczego pod kluczem, to ustawiony przez ciebie pusty String "";
String answer= getIntent().getExtras().getString("KEY_ANSWER","");
// log w konsoli
 Log.e(TAG, "initVariable: answer="+answer);
// nie wiem po co "equalsIgnoreCase" zamiast zwykłego "equals", ale sprawdzasz, czy wartość Stringa "answer" równa się "Good Answer"
  if(answer.equalsIgnoreCase("Good Answer")){
// Próbujesz pobrać argument który zapewne przekazałeś do rozpoczynanej aktywności. Klucz "KEY_ANOTHER_BUTTON", domyślna wartość zwrócona jeżeli nie ma niczego pod kluczem, to ustawiony przez ciebie pusty String "";
 String  anotherButton= getIntent().getExtras().getString("KEY_ANOTHER_BUTTON","");
// to samo, log w konsoli
Log.e(TAG, "initVariable: another button="+anotherButton );
// ustawiasz widoczność widgetu textViewDisplayButton na visible
 textViewDisplayButton.setVisibility(View.VISIBLE);
// ustawiasz text na wartość przechowywaną pod zmienną "anotherButton"
  textViewDisplayButton.setText(anotherButton);

Pozostało 580 znaków

2017-11-30 11:48

Rejestracja: 3 lata temu

Ostatnio: 10 miesięcy temu

0

Super, dziękuje. Nie do końca tylko rozumiem co dokładnie dzieje się w tej linii Log.e(TAG, "initVariable: another button="+anotherButton );

Pozostało 580 znaków

2017-11-30 12:05

Rejestracja: 4 lata temu

Ostatnio: 2 godziny temu

0
Kubs napisał(a):

Super, dziękuje. Nie do końca tylko rozumiem co dokładnie dzieje się w tej linii Log.e(TAG, "initVariable: another button="+anotherButton );

Czego tu nie rozumiesz? Do logu zostaje wpisany komunikat błędu (error) "initVariable: another button="+anotherButton

https://developer.android.com/reference/android/util/Log.html

Twoja architektura zdaje się być pokręcona. Mógłbyś powiedzieć co robi AnswerActivity i MainActivity, jaka jest między nimi interakcja?

edytowany 4x, ostatnio: nalik, 2017-11-30 12:23
Pokaż pozostałe 2 komentarze
Bingo :) - Kubs 2017-11-30 13:38
To zrób jak napisał GregoryI. Zamiast przekazywać stringa możesz przekazać dowolną klasę (implementującą Parcelable albo Serializable) lub pojedyńczą wartość typu boolean i na jej podstawie wyświetlać odpowiedni widok. Guzik znajdujesz na podstawie id w layoucie t.j. findViewById(R.id.id_mojego_guzika). Na podstawie przekazanego stanu/modelu zmieniasz widoczność guzika. - nalik 2017-11-30 14:03
Dziękuje. Zapewne jest to bardzo dobre rozwiązanie, jednak na tą chwilę jeszcze nie dam rady wykonać tego sam. Czytając to rozumiem idee ale programowo nie dam rady tego napisac :) - Kubs 2017-11-30 14:41
To są podstawy podstaw. Na początku może Ci się to wydawać trudne, ale jak usiądziesz i spróbujesz zrobić to szybko je opanujesz. - nalik 2017-11-30 14:45
Zerkniesz proszę jeszcze na drugą stronę tego wątku, uaktualniłem go o jeszcze jedno pytanie. Z góry dziękuje. - Kubs 2017-11-30 17:30

Pozostało 580 znaków

2017-11-30 12:16

Rejestracja: 3 lata temu

Ostatnio: 10 miesięcy temu

0

Dziękuje. Teraz już rozumiem, że jest to wpisany błąd z loga. Jeszcze tylko nie wiem, dlaczego ten błąd/ten log został tu w kodzie umiejscowiony.

Pozostało 580 znaków

2017-11-30 12:26

Rejestracja: 5 lat temu

Ostatnio: 18 godzin temu

0
Kubs napisał(a):

Dziękuje. Teraz już rozumiem, że jest to wpisany błąd z loga. Jeszcze tylko nie wiem, dlaczego ten błąd/ten log został tu w kodzie umiejscowiony.

Ktoś go umieścił w celu debugowania aplikacji. Możesz logi podejrzeć w Logcat.


Wiedza to potęga

Pozostało 580 znaków

2017-11-30 13:08

Rejestracja: 3 lata temu

Ostatnio: 10 miesięcy temu

0

Tak Haskell, logi w LogCat, to wiem. Debugowanie aplikacji tez pomału rozumiem. A możesz rozwinąć co dokładnie daje umieszczenie tej linijki kodu w tym miejscu?

edytowany 2x, ostatnio: Kubs, 2017-11-30 13:09

Pozostało 580 znaków

Odpowiedz

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