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

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).

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).
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="" />
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.

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);


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);
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 );

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?

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.

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.

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?

0
Kubs napisał(a):

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?

To samo co umieszczenie wypisywanie na konsolę (printf, cout, println, etc) w studenckim programie. Patrząc na log możesz wywnioskować co się działo podczas wykonania programu ( w miejscu gdzie zostało wstawione wypisywanie).

0

Super wytłumaczone. Jeszcze tylko nie do końca rozumiem - czyli zaznaczam do debuggowania to miejsce z tą linijką kodu? Wybacz mój brak wiedzy w tym temacie :)

0
Kubs napisał(a):

Super wytłumaczone. Jeszcze tylko nie do końca rozumiem - czyli zaznaczam do debuggowania to miejsce z tą linijką kodu? Wybacz mój brak wiedzy w tym temacie :)

Nie chodzi o używanie debugera. Czasami nie chcesz używać debugera, wolisz by program działał normalnie, bez zatrzymywania się w funkcjach. Alternatywą jest wypisywanie komunikatów w czasie działania programu. Na podstawie tych komunikatów wpisanych do logu widzisz co robi program.

Aktualną zawartość loga dla podłączonego do komputera telefonu można podejrzeć na żywo w Android Studio w zakładce logcat, albo w konsoli używając komendy adb logcat.

0

Pomału coś świta. Czy coś szczególnego zaznaczam/zmieniam w ustawieniach logcat gdy używam telefonu? Bo informacji wyrzuca masę i chyba po prostu nie wiem jak to przefiltrować do minimum żeby zobaczyć tą liniję kodu. I jeszcze dopytam - gdzie wpisać tą komendę adb logcat w konsolę?

0

Witajcie,
pozwoliłem sobie tu uaktualnić post (ale może to niezbyt dobra praktyka).

Powiedzmy, że zamieniam ten przycisk na zwykły string "Przesuń ekran by zobaczyć wygraną". Jak w tym samy czasie uruchomić możliwość przesunięcia ekranu na kolejny Fragment?
(AnswerActivity jest klasą)

0
Kubs napisał(a):

Witajcie,
pozwoliłem sobie tu uaktualnić post (ale może to niezbyt dobra praktyka).

Powiedzmy, że zamieniam ten przycisk na zwykły string "Przesuń ekran by zobaczyć wygraną". Jak w tym samy czasie uruchomić możliwość przesunięcia ekranu na kolejny Fragment?
(AnswerActivity jest klasą)

Przeczytaj:
https://developer.android.com/training/animation/screen-slide.html
https://stackoverflow.com/questions/29442216/how-to-disable-or-enable-viewpager-swiping-in-android

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