1. Mitglieder surfen ohne Werbung auf Android-Hilfe.de! ✔ Jetzt kostenlos Mitglied in unserer Community werden.
  1. no1Ltan, 05.08.2018 #1
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    Hallo Leute,

    bin ziemlich unerfahren im Bereich Android-Programmierung und brauche eure Hilfe.
    Obwohl ich schon einige Fortschritte gemacht habe (Buttons mit Funktionen erstellen, designen etc.),
    hänge ich grad bei diesem Thema fest:
    Multiple Pages auf Android Wear.

    Um es so einfach wie möglich zu erklären habe ich eine Skizze erstellt:
    [​IMG]

    Im Prinzip soll beim Starten der App nur die Ziffer und eine Farbe zu sehen sein.
    Diese beiden Werte sollen dann mittels der 2. und 3. Seite verändert werden können.
    (Durch Drücken der entsprechenden Buttons.)

    Das Hin- und Herwechseln zwischen den Seiten soll mittels horizontalem Wischen erfolgen.
    So, wie auf dieser Beispiel-Gif, nur ohne das vertikale Wischen und ohne die Punkte, die die Seite anzeigen.
    [​IMG]

    Kann ich mein Vorhaben mittels:
    - 2 Java-Klassen (MainActivity.java, SectionFragment.java)
    - 2 Layouts (activity_main.xml, fragment_section.xml)
    realisieren?

    Oder brauche ich in diesem Fall 3 Java-Klassen und 3 Layouts?
    Beispielsweise:
    - MainActivity.java, Colors_Activity.java, Values_Activity.java
    - activity_main.xml, activity_colors.xml, activity_values.xml

    Danke für jede Hilfe!
     
  2. jogimuc, 06.08.2018 #2
    jogimuc

    jogimuc Android-Hilfe.de Mitglied

    Hallo
    Ich kenne mich mit Wear nicht aus.
    Bei einem Handy macht man das mit Fragmenten die immer wieder ausgetauscht werden. Da zu kann man den Viewpager benutzen schaue mal ob es den bei wear auch gibt.
    Es gibt dann nur eine activity und für jede angezeigte Seite ein Fragment . Ob es Viewpager bei Wear gibt weiss ich leider nicht aus dem Kopf.

    Du brauchst 4 Klassen Main und 3 Fragmente. Dazu 4 Layouts .
     
    Zuletzt bearbeitet: 07.08.2018
  3. no1Ltan, 08.08.2018 #3
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    Erstmal vielen Dank für deine Antwort.
    Ich habe mich entschlossen, erstmal meine Basics zu verbessern und mich nur auf Smartphone zu konzentrieren.
    Ein direkter Anfang mit Wear und solch einer App scheint wohl doch etwas zu viel... für den Anfang.
     
  4. no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    Hallo,

    habe mich mal wieder mit dieser Thematik beschäftigt - allerdings nicht auf Wear sondern auf Mobile.
    Vom Design und Handling her habe ich es dank Tutorials hinbekommen.
    Man kann ganz normal hin- und herwischen.

    Mein Problem ist derzeit allerdings, dass ich auf die Buttons, die sich auf View 2 befinden, nicht zugreifen kann.
    Die Test-App besteht aus 4 Activities:
    - MainActivity
    - Page_1
    - Page_2
    - Page_3
    und 5 layouts:
    - activity_main.xml
    - content_main.xml
    - page1.xml
    - page2.xml
    - page3.xml

    Beim Starten der App im Emulator kann ich wie schon erwähnt hin- und herswipen und sehe ganz klar die verschiedenen Views.
    Wenn ich bei Page_2.java nun auf die Buttons zugreifen möchte, erscheint kein findViewById.
    Es erscheint immer finalize() (als Vorschlag).
    (Die Button-Klasse hatte ich selbstverständlich importiert.)

    Ich las, dass man den Zugriff auf den Button unterhalb der inflater.inflate machen muss.
    Auch das habe ich probiert, aber es ging nicht.
    Hat jemand einen Rat, was ich bei Page_2.java hinzufügen muss, um auf Buttons zugreifen zu können?
    Einen protected void onCreate(Bundle savedInstanceState) konnte ich nicht hinzufügen.

    Die Codes in "Roh-Form":
    MainActivity.java
    Code:
    package com.example.USER.clipcodes_swiping;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity
    {
        ViewPager vp;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ViewPager vp = findViewById(R.id.vp);
            SetUpViewPager(vp);
        }
        public void SetUpViewPager(ViewPager viewpage)
        {
            MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
            Adapter.AddPageFragment(new Page_1(), "Page 1");
            Adapter.AddPageFragment(new Page_2(), "Page 2");
            Adapter.AddPageFragment(new Page_3(), "Page 3");
            viewpage.setAdapter(Adapter);
        }
        public class MyViewPagerAdapter extends FragmentPagerAdapter
        {
            private List<Fragment> MyFragment = new ArrayList<>();
            private List<String> MyPageTitle = new ArrayList<>();
    
            public MyViewPagerAdapter(FragmentManager manager)
            {
                super(manager);
            }
            public void AddPageFragment(Fragment Frag, String Title)
            {
                MyFragment.add(Frag);
                MyPageTitle.add(Title);
            }
            @Override
            public Fragment getItem(int i)
            {
                return MyFragment.get(i);
            }
    
            @Nullable
            @Override
            public CharSequence getPageTitle(int position)
            {
                return MyPageTitle.get(position);
            }
    
            @Override
            public int getCount()
            {
                return 3;
            }
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
        @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            int id = item.getItemId();
    
            if (id == R.id.action_settings)
            {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    
    
    Page_1.java (Das gleiche auch für Page_2.java und Page_3.java, nur eben mit 2, Two + Button-Klasse, 3, Three):
    Code:
    package com.example.USER.clipcodes_swiping;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class Page_1 extends Fragment
    {
        public Page_1(){} // Constructor
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View PageOne = inflater.inflate(R.layout.page1, container, false);
            return PageOne;
        }
    }
    
    
    
    activitiy_main.xml
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout 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"
        tools:context=".MainActivity">
    
        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />
    
        </android.support.design.widget.AppBarLayout>
    
        <include layout="@layout/content_main" />
    
    </android.support.design.widget.CoordinatorLayout>
    
    content_main.xml
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.view.ViewPager 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:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context=".MainActivity"
        tools:showIn="@layout/activity_main"/>
    
    page1.xml:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        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:text="Page1"
        android:background="@color/brown">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="176dp"
            android:layout_marginTop="60dp"
            android:text="page1"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>
    
    page2.xml:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout 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:id="@+id/con_layout2"
        android:layout_height="match_parent"
        android:background="@color/red"
        android:text="Page2">
    
        <Button
            android:id="@+id/button_red"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:text="@string/button_red"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Button
            android:id="@+id/button_blue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:text="@string/button_blue"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/button_red"
            app:layout_constraintVertical_bias="0.197" />
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="60dp"
            android:text="page2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.501"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>
    
    page3.xml:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        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:text="Page3"
        android:background="@color/yellow">
    
        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="172dp"
            android:layout_marginTop="60dp"
            android:text="page3"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>
    
    Danke für jede Hilfe!
     
  5. deek

    deek Android-Experte

    In Fragments musst du das in der onCreateView auf der View machen, also:

    Code:
    public class Page_1 extends Fragment
    {
       public Page_1(){} // Constructor
       @Nullable
       @Override
       public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
       {
           View PageOne = inflater.inflate(R.layout.page1, container, false);
           Button button = (Button)PageOne.findViewById(....)
           return PageOne;
       }
    }
    
    Kleine Hinweise zum Code Style (per Java Konvention):
    - einen leeren Konstruktor musst du nicht definieren, der ist immer da
    - Klassennamen sollten keinen Unterstrich enthalten Page_1 -> Page1, besser sogar einen beschreibenden Namen verwenden, falls die Reihenfolge später mal geändert wird. Sowas wie IntroPage vielleicht (je nach Zweck der Seite)
    - Variablennamen sollten mit Kleinbuchstaben anfangen.
    - In Packagenamen auch keine Unterstriche, diese komplett klein halten, wenn erfordert einen weiteren Punkt dazu
     
    no1Ltan bedankt sich.
  6. jogimuc

    jogimuc Android-Hilfe.de Mitglied

    Ergänzen möchte ich noch das du auch die Activity benutzen kannst.

    Button button = (Button) getActivity().findViewById(....);
    button..setOnClickListener(this);

    kannst dir den Context auch in einer Variablen speichern.
    Activity myActivity;
    myActivity = getActivity();

    In der onAttach(Activity activity) bekommst du auch die Activity übergeben.

    @override
    public void onAttach(Activity activity) {
    super.onAttach(activity);
    myActivity = activity;
    }


    Somit bist du flexibler mit dem findViewById und nicht auf die onCreateView angewiesen.
     
    no1Ltan bedankt sich.
  7. deek

    deek Android-Experte

    getActivity ist aber gefährlich, gerade mit einem ViewPager. (gefährlich im Sinne von kann null zurückgeben)
    Ich würde um auf Views zuzugreifen, die sowieso im Fragment Layout sind lieber darauf verzichten, da ist die sicherere Methode onCreateView.
    Wenn man den ViewPager mal etwas umbaut auf lazy loading kann der munter Fragmente bauen und zerstören, oder im Speicher halten wenn die Activity destroyed wird (Bildschirm drehen) und schwupps hast du gerade entweder gar keine oder die falsche (alte) Activity in der Hand.
     
    no1Ltan bedankt sich.
  8. jogimuc

    jogimuc Android-Hilfe.de Mitglied

    Beim drehen des Handys ändert sich doch nicht die activity. Mit onAttach sollte aber die richtige activity übergeben werden.

    Ok auch da kann es Probleme geben wenn nur die view zerstört wird wird onAttach nicht durchlaufen.
    Danke für den Hinweis.
     
    Zuletzt bearbeitet: 16.08.2018 um 23:19 Uhr
    no1Ltan bedankt sich.
  9. no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    Hallo,

    erstmal ein großes Danke für euren Support!

    Bezüglich der Codes in meinem Post muss ich ehrlich zugeben, dass ich dieses Beispiel mittels eines Tutorials nachgestellt habe.
    Normalerweise schreibe ich Variablennamen immer im Camel Case, z.B. buttonRed.
    Ebenso würde ich natürlich nie Page_1.java, Page_2.java etc. verwenden,
    sondern eher SettingsActivity.java, ColorsActivity.java usw.
    Ich muss zugeben, dass ich das mit Page_1.java und dann PageOne echt verwirrend finde.
    Allerdings würde ich ausnahmsweise in diesem App-Beispiel so lassen.
    Soweit ich aber weiß, soll man die Unterstriche bei ids verwenden, z.B. button_red.

    Dass man leere Konstruktoren nicht definieren muss, wusste ich nicht - hatte ich in einem Lernvideo gesehen.
    Vielleicht liegt das ja an der neueren Android Studio Version?

    Jedenfalls habe ich wieder gute Fortschritte gemacht!
    Die Buttons der "Page_2" ändern die Hintergrundfarbe und Textfarbe von Page_1.
    Das einzige Problem ist, dass ich die Änderung erst sehe, wenn ich von Page_2 auf Page_3 wechsele
    und danach auf Page_2 und Page_1.
    Beim direkten Wechsel von Page_2 auf 1 (nachdem ich geklickt habe), ändert sich nichts.

    Das sind die Codes, die ich modifiziert habe:
    Hab auch Kommentare hinzugefügt, damit man sieht, ob ich die Codezeilen auch tatsächlich verstanden habe.
    Page_1.java

    Code:
    package com.example.USER.clipcodes_swiping;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.constraint.ConstraintLayout;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import static android.content.Context.MODE_PRIVATE;
    
    public class Page_1 extends Fragment
    {
        int colorNumber, textColor; // Variables for SharedPreferences
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View PageOne = inflater.inflate(R.layout.page1, container, false); // Link view to layout?
            SharedPreferences prefs = getActivity().getSharedPreferences("bgColor", MODE_PRIVATE); // Load saved shared file
            colorNumber = prefs.getInt("color", colorNumber); // Load saved background color
            textColor = prefs.getInt("tcolor", textColor); // Load saved text color
            ConstraintLayout conLayout1 = PageOne.findViewById(R.id.con_layout1); // Link variable to ID
            conLayout1.setBackgroundColor(colorNumber); // Change background color
            TextView tv1 = PageOne.findViewById(R.id.tv_1); // Link variable to ID
            tv1.setTextColor(textColor); // Change text color
            return PageOne;
        }
    }
    
    
    Page_2.java
    Code:
    package com.example.USER.clipcodes_swiping;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import static android.content.Context.MODE_PRIVATE;
    
    public class Page_2 extends Fragment
    {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View PageTwo = inflater.inflate(R.layout.page2, container, false);
            Button buttonRed = PageTwo.findViewById(R.id.button_red);  // Link variable to ID
            buttonRed.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    setColor(getResources().getColor(R.color.red), getResources().getColor(R.color.white)); // Load setColor method and send 2 color values
                }
            });
            Button buttonBlue = PageTwo.findViewById(R.id.button_blue);  // Link variable to ID
            buttonBlue.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    setColor(getResources().getColor(R.color.blue), getResources().getColor(R.color.black)); // Load setColor method and send 2 color values
                }
            });
            return PageTwo;
        }
        public void setColor (int colorNumber, int textColor) // Write color values into SharedPreferences
        {
            Intent intentColor = new Intent(getActivity(), Page_1.class); // Create intent for current Activity and target activity
            SharedPreferences prefs = getActivity().getSharedPreferences("bgColor", MODE_PRIVATE); // Create new SharedPreferences instance
            SharedPreferences.Editor editor = prefs.edit(); // Assign variable to editor function
            editor.putInt("color", colorNumber); // Write background color (int) inside of editor
            editor.putInt("tcolor", textColor); // Write text color (int) inside of editor
            editor.commit(); // Save values, close process
        }
    }
    
    Achso, eine kleine Unklarheit habe ich dennoch:
    Ich dachte ursprünglich, dass die MainActivity die 1.Seite der App wäre.
    Aber anscheinend sorgt sie "nur" dafür, dass die 3 Seiten miteinander kommunizieren und verbunden sind.
    Der Benutzer arbeitet also nicht direkt mit der MainActivity, so wie man das bei einer 1-Seitigen App kennt.
    Habe ich das richtig erfasst?

    Viele Grüße
     
  10. jogimuc

    jogimuc Android-Hilfe.de Mitglied

    Hi also ich führe änderungen am layout wie settext usw. nicht in der onCreateView aus .
    Sondern in der onActivityCreated aus. Kannst du als die onCreate des Fragments ansehen.
    Zu dem Zeitpunkt ist auch das layout schon geladen.
    Der Pager wird sich wohl beim Swype von 1 zu 2 die View auf den Backstack laden. Um schnell wieder zurück gehen zu können. Dabei wird die View nicht neu geladen. Wenn er ein weiter Seite geladen hat ist der Backstack wohl veraltet und die View wird neu geladen.

    die Methode onActivityCreated sollte aber ausgeführt werden. Kannst es ja mit ein paar Logs verfolgen.


    Zu deinem Code was machst du eigentlich mit dem Intent? Denn kannst du nicht auf ein Fragment anwenden.
    Ein Fragment wird sozusagen in der activity ausgeführt und das layout des Fragment wird mit dem layout der Activity getauscht. Die activity wird dabei nicht beendet die läuft die ganze Zeit.

    Zu deiner kleinen Unklarheit, ja so kann man es sehen. Ein fragment kann nicht alleine laufen es braucht immer eine activity.
     
    Zuletzt bearbeitet: 17.08.2018 um 18:12 Uhr
    no1Ltan bedankt sich.
  11. no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    Hi,
    ok, aber ich brauche dennoch die onCreateView, oder?
    Weil wenn ich es nur mit der onActivityCreated versuche, kennt er die inflater nicht.
    Ich kann leider nur schwer einschätzen, ob ich mit dem Code knapp daneben liege
    oder ob's viele Fehler gibt.
    Hab auf jeden Fall gelesen, dass die Reihenfolge onCreate -> onCreateView -> onActivityCreated sein soll/muss.
    (Eine onCreate gibt's bei mir im eigentlichen Sinne ja nicht - nur in der mainActivity.java.)

    P.S: Den Intent hab ich auf Page_2 rausgeschmissen. Hattest Recht, der hatte keinen Effekt.

    [​IMG]
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
Android Studio - App stürtzt immer ab Android App Entwicklung 24.06.2018
ListView mit eigenem Layout zeigt im Querformat Items doppelt an Android App Entwicklung 24.06.2018
Bluetooth LE mit MIT App Inventor 2 Android App Entwicklung 15.06.2018
Daten für eine Stundenplan-App Android App Entwicklung 23.05.2018
App wird nach start sofort beendet! Android App Entwicklung 21.05.2018
Service stoppt wenn App geschlossen wird Android App Entwicklung 16.05.2018
Daten von Android Wear zur Handy-App senden geht nicht Android App Entwicklung 03.04.2018
In App Billing Android App Entwicklung 11.03.2018
Benötigte Zugriff ausschalten Android App Entwicklung 07.03.2018
App-Aktualisierungen richtig testen und an den User bringen. Android App Entwicklung 03.03.2018
Du betrachtest das Thema "Wie viele Klassen und Layouts brauche ich für meine App?" im Forum "Android App Entwicklung",
  1. Android-Hilfe.de verwendet Cookies um Inhalte zu personalisieren und dir den bestmöglichen Service zu gewährleisten. Wenn du auf der Seite weitersurfst stimmst du der Cookie-Nutzung zu.  Ich stimme zu.