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

    DjTommy79 Threadstarter Neuer Benutzer

    Hallo Leute!
    Ich bin neu hier und arbeite seit ca. 2 Monate mit Android Studio Version 3.3 Canary 13
    Ich habe schon eine kleine App für mein HTC M9 Android 7.0(Nougat) programmiert.
    Ich hoffe, dass ich meine Frage im richtigen Forum stelle.
    Wie gesagt ich bin neu hier und kenne mich noch nicht hier sehr gut aus.
    Also bitte nicht böse sein, wenn ich hier was falsch mache.
    Nun zu meiner Frage:
    Ich möchte mir einen eigenen Kalender zu programmieren mit eigen wünschen.
    Das Layout und die Funktion steht schon mal.
    Mein Problem liegt daran, dass ich es nicht hinbekomme das ich unbegrenzt von beiden Seiten mit den Fingern scrollen kann.
    Den die Originale HTC Kalender kann man Naht los und unbegrenzt monatlich nach vor und retour scrollen kann.
    Ich habe im Internet nach mein Problem recherchiert aber bis heute nichts Passendes gefunden.

    Meine Überlegung wäre das es 3 Fragmente gibt
    und um es unbegrenzt zu nutzten, wäre (1,2,3,1,2,3) nach vorne und rückwärts (3,2,1,3,2,1)
    und bei jeden scrollen das Layout Kalender aktualisiert wird.
    Ich dachte an sowas:
    Fragment 1 und das ist der jetzige Monat.
    Fragment 3 Kalender von vor Monat aktualisiert
    Fragment 2 Kalender für nächste Monat aktualisiert.
    Wird es nach vorne gescroll das sieht es so aus.

    Fragment 2 und das ist der jetzige Monat.
    Fragment 1 Kalender von vor Monat aktualisiert
    Fragment 3 Kalender für nächste Monat aktualisiert.

    Wird rückwärts gescroll das sieht es so aus.

    Fragment 3 und das ist der jetzige Monat.
    Fragment 1 Kalender von vor Monat aktualisiert
    Fragment 2 Kalender für nächste Monat aktualisiert.
    Und so weiter…

    Ich hoffe, dass ich kein denk, Fehler habe und ihr wisst was ich meine und ob ihr mir vielleicht helfen könnt.

    Danke im Voraus
     
  2. jogimuc, 29.10.2018 #2
    jogimuc

    jogimuc Erfahrener Benutzer

    Hallo Willkommen im Forum.
    Eine Frage zu deinem vorhaben.
    Wieso willst du für die gleiche Ansicht verschiedene Fragmente benutzen?
    Du willst doch immer nur die Monatsansicht haben wenn du einen Monat vor oder zurück willst ändere doch einfach nur die Daten und zeige sie im selben Fragment an.

    Gehe ich richtig in der Annahme das du das mit dem ViewPager machen willst?
    Wahrscheinlich wegen den dort schon integrierten Swipe.

    Das würde ich nicht empfehlen erstens wird da das Nachbar Fragment nicht immer richtig aktualisiert, und die Fragmente im Ring zu durchlaufen ist da auch nicht so einfach.
    Entweder du fügst Button für vor und zurück ein oder du benutzt den OnGestureListener
    und wertest das Swipe selber aus.

    Auch wenn du an deinen Fragmenten fest halten willst würde ich den Swipe selber auswerten.
    Und mir immer merken welches Fragment gerade angezeigt wird. Damit du weist welches Fragment beim Swipe angezeigt werden muss. die Reihenfolge kannst du somit selber bestimmen.

    Vorteil und manchmal auch Nachteil ist dabei das immer das gesamte Fragment geladen wird mit allen was dazu gehört. Auf jedenfalls wird es somit immer aktualisiert, wenn das aber recht lange dauert, weil zb. Daten aus einer externen DB geladen werden müssen ist da meist nicht so schön.

    Hier mal ein einfaches Beispiel wie du einen Swipe erkennen Kannst.

    Code:
    public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {
    
        GestureDetector detector;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            detector = new GestureDetector(this, this);
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            return detector.onTouchEvent(event);
        }
    
        @Override
        public boolean onDown(MotionEvent e) {
            return false;
        }
    
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    
            if(e2.getX()> e1.getX()){
                // swipe von links nach rechts
                Toast.makeText(getApplicationContext(), "Swipe left to right", Toast.LENGTH_SHORT).show();
    
            } else{
                if ( e2.getX()<e1.getX()){
                    // swipe von rechts nach links
                    Toast.makeText(getApplicationContext(), "Swipe right to left", Toast.LENGTH_SHORT).show();
                }
            }
    
            return true;
        }
    
        @Override
        public void onLongPress(MotionEvent e) {
        }
    
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
                                float distanceY) {
            return false;
        }
    
        @Override
        public void onShowPress(MotionEvent e) {
        }
    
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
           return true;
        }
    }
    
    Leider muss man bei dem Interface alle Methoden überschrieben.
    Eigentlich brauchst du nur die eine.
     
    Zuletzt bearbeitet: 29.10.2018
  3. DjTommy79, 30.10.2018 #3
    DjTommy79

    DjTommy79 Threadstarter Neuer Benutzer

    Hallo jogimuc!

    Erstmal danke für deine Antworten:)

    Wie gesagt ich arbeite ca. 2 Monate mit Android und habe noch nicht viel Ahnung von dieser Programmierung.

    Ich dachte man braucht 3 Fragmente damit man die vor und nach Monate mit ladet, damit wenn man je nach Richtung auch die vorgeladene Monat sieht.

    Ich habe dein Code mit angeschaut.

    Aber leider dürftest du mich etwas falsch verstanden haben.

    Ich meinte das die Fragmente sich auch verschieben lassen.

    Ist das irgendwie möglich?



    Danke im Voraus.
     
  4. jogimuc, 30.10.2018 #4
    jogimuc

    jogimuc Erfahrener Benutzer

    Hallo
    Also wenn du es so haben willst das das neue Fragment schon zur hälfte angezeigt wird beim Swipe dann würde ich wohl doch den Viewpager benutzen .
    Ich kann dir aber nicht sagen wie du den einstellen musst damit er auch im Kreis Swipet. 123123….
    Auch musst du beachten das immer schon die benachbarten Fragmente vorgeladen werden.
    Wenn das benachbarte Fragment nicht vom vorhergehenden abhängig ist das kein Problem.
    Beim sichtbar werden des Fragment wird die onResume nicht mehr durchlaufen
     
  5. DjTommy79, 30.10.2018 #5
    DjTommy79

    DjTommy79 Threadstarter Neuer Benutzer

    Hallo jogimuc!

    Ich zeige dir den Code, was ich bisher geschafft habe.
    Dies ist ein Code, den ich im Internet gefunden habe.
    Dieser Code manipuliert den ViewPager damit es egal was für eine Richtung gewischt wird, endlos gescrollt werden kann.
    activity_main.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:minHeight="0dp"
        tools:context=".MainActivity">
        <RelativeLayout
            android:id="@+id/RL"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/labJahr"
            tools:layout_editor_absoluteX="0dp">
    
            <TextView
                android:id="@+id/counter"
                android:layout_width="match_parent"
                android:layout_height="25dp"
                android:layout_below="@+id/content"
                android:layout_marginTop="193dp"
                android:text="TextView" />
    
            <TextView
                android:id="@+id/content"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_alignTop="@+id/pager"
                android:layout_alignBottom="@+id/pager"
                android:layout_centerHorizontal="true"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="207dp"
                android:layout_marginBottom="241dp" />
    
            <android.support.v4.view.ViewPager
                android:id="@+id/pager"
                android:layout_width="match_parent"
                android:layout_height="fill_parent"
                android:layout_alignTop="@+id/labMonth"
                android:layout_centerHorizontal="false"
                android:layout_marginTop="0dp"
                android:visibility="visible" />
        </RelativeLayout>
    
        <TextView
            android:id="@+id/labJahr"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:background="#fff092b0"
            android:gravity="center"
            android:text="Jahr"
            android:textSize="25dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </android.support.constraint.ConstraintLayout>
    fragment.xml
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <RelativeLayout
            android:id="@+id/RL"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/labJahr">
    
            <TextView
                android:id="@+id/labMonth"
                android:layout_width="match_parent"
                android:layout_height="30dp"
                android:layout_alignParentTop="true"
                android:layout_marginTop="0dp"
                android:background="#fff092b0"
                android:gravity="center"
                android:text="Monat"
                android:textSize="25dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent" />
    
            <TextView
                android:id="@+id/txtMo"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_below="@+id/labMonth"
                android:layout_alignParentStart="true"
                android:layout_alignParentLeft="true"
                android:layout_marginStart="2dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="0dp"
                android:background="#00FFFF"
                android:gravity="center"
                android:text="Mo"
                android:textSize="20dp" />
    
            <TextView
                android:id="@+id/txtDi"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_below="@+id/labMonth"
                android:layout_marginStart="2dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="0dp"
                android:layout_toEndOf="@+id/txtMo"
                android:layout_toRightOf="@+id/txtMo"
                android:background="#00FFFF"
                android:gravity="center"
                android:text="Di"
                android:textSize="20dp" />
    
            <TextView
                android:id="@+id/txtMi"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_below="@+id/labMonth"
                android:layout_marginStart="2dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="0dp"
                android:layout_toEndOf="@+id/txtDi"
                android:layout_toRightOf="@+id/txtDi"
                android:background="#00FFFF"
                android:gravity="center"
                android:text="Mi"
                android:textSize="20dp" />
    
            <TextView
                android:id="@+id/txtDo"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_below="@+id/labMonth"
                android:layout_marginStart="2dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="0dp"
                android:layout_toEndOf="@+id/txtMi"
                android:layout_toRightOf="@+id/txtMi"
                android:background="#00FFFF"
                android:gravity="center"
                android:text="Do"
                android:textSize="20dp" />
    
            <TextView
                android:id="@+id/txtFr"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_below="@+id/labMonth"
                android:layout_marginStart="2dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="0dp"
                android:layout_toEndOf="@+id/txtDo"
                android:layout_toRightOf="@+id/txtDo"
                android:background="#00FFFF"
                android:gravity="center"
                android:text="Fr"
                android:textSize="20dp" />
    
            <TextView
                android:id="@+id/txtSa"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_below="@+id/labMonth"
                android:layout_marginStart="2dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="0dp"
                android:layout_toEndOf="@+id/txtFr"
                android:layout_toRightOf="@+id/txtFr"
                android:background="#00FFFF"
                android:gravity="center"
                android:text="Sa"
                android:textSize="20dp" />
    
            <TextView
                android:id="@+id/txtSo"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_below="@+id/labMonth"
                android:layout_marginStart="2dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="0dp"
                android:layout_toEndOf="@+id/txtSa"
                android:layout_toRightOf="@+id/txtSa"
                android:background="#00FFFF"
                android:gravity="center"
                android:text="So"
                android:textColor="#F00"
                android:textSize="20dp" />
    
            <TextView
                android:id="@+id/counter"
                android:layout_width="match_parent"
                android:layout_height="25dp"
                android:layout_below="@+id/content"
                android:layout_marginTop="193dp"
                android:text="TextView" />
    
            <TextView
                android:id="@+id/content"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_alignTop="@+id/pager"
                android:layout_alignBottom="@+id/pager"
                android:layout_centerHorizontal="true"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="207dp"
                android:layout_marginBottom="241dp" />
    
            <android.support.v4.view.ViewPager
                android:id="@+id/pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignTop="@+id/labMonth"
                android:layout_marginTop="0dp"
                android:visibility="visible" />
        </RelativeLayout>
    
    </android.support.constraint.ConstraintLayout>
    MainActivity.java
    Code:
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.RelativeLayout;
    
    
    public class MainActivity extends AppCompatActivity   {
        public static final String[] content = new String[]{ "Test1", "Test2","Test3"};
    
        RelativeLayout RL;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
            ViewPager pager = findViewById(R.id.pager);
            TextView counter = findViewById(R.id.counter);
            TextView zu = findViewById(R.id.pager);
    
            SimpleViewPagerAdapter adapter = new SimpleViewPagerAdapter( getSupportFragmentManager(), pager, content, counter);
            pager.setAdapter(adapter);
            pager.setOnPageChangeListener(adapter);
           pager.setCurrentItem(1, false);
    
        }
    SimpleFragment.java
    Code:
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    public class SimpleFragment extends Fragment {
        private View rootView;
        public SimpleFragment() {
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
        {
            rootView = inflater.inflate(R.layout.fragmet , container,false);
            String content = getArguments().getString("content");
            TextView textView = (TextView) rootView.findViewById(R.id.content);
            textView.setText(content);
            return rootView;
        }
    }
    
    SimpleViewPagerAdapter.java
    Code:
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentStatePagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.util.Log;
    import android.widget.TextView;
    
    public class SimpleViewPagerAdapter extends FragmentStatePagerAdapter implements ViewPager.OnPageChangeListener{
    Integer h=0;// <---Testweise
        private String[] content;
        private ViewPager pager;
        private TextView counter;
    
        public SimpleViewPagerAdapter(FragmentManager fm, ViewPager pager,String[] content, TextView counter)
        {
            super(fm);
            this.pager = pager;
            this.content = content;
            this.counter = counter;
        }
    
        @Override
        public Fragment getItem(int position) {
            SimpleFragment fragment = new SimpleFragment();
            Bundle bundle = new Bundle();
            int index = position - 1;
            if (position == 0) {
                index = content.length - 1;
            } else if (position == content.length + 1) {
                index = 0;
            }
            h+=1;//<--Zahl erhöhen
            bundle.putString("content", String.valueOf(h));//<--Zahl anzeigen
    //  bundle.putString("content", content[index]);// <--- um den Text (Test1,Test2,Test3) anzuzeigen
               fragment.setArguments(bundle);
            return fragment;
        }
    
        @Override
        public int getCount() {
            return content.length + 2;
        }
    
        @Override
        public void onPageSelected(int position) {
            if (position == 0) {
                pager.setCurrentItem(content.length, false);
                Log.d("FF",
                        "Swiped before first page, looping and resetting to last page.");
            } else if (position == content.length + 1) {
                pager.setCurrentItem(1, false);
    
                Log.d("FF",
                        "Swiped beyond last page, looping and resetting to first page.");
            } else {
    
            }
        }
    
        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }
    }
    Ich habe mit Absicht eine Variable h erstellt, um zu sehen, was da vor sich geht.

    Aber irgendwie wird da nicht richtig Aktualisiert.

    Bei jedem wischen kommen diese zahlen

    1,3,4,6,3,8,10,3

    Erstmal war mit das egal, das Zahlen übersprungen werden.

    Aber bei jeden 3ten wisch erscheint die zahl 3 und da wusste ich, das hier wird, nicht aktualisiert.:confused2:

    Und das ist mein Problem.
    Ist das, was du gemeint, was du geschrieben hast,
    Es muss doch möglich sein den andere Apps können es ja auch.

    Kannst du dir den Code mal anschauen, wenn du zeit und Lust hast bitte?
    Oder ein anderer in diesem Forum:1f62d:

    Danke im Voraus
     
  6. jogimuc, 30.10.2018 #6
    jogimuc

    jogimuc Erfahrener Benutzer

    Hallo erstmal würde ich sagen das mit deinem h ist falsch .
    Du erhöhst es nur aber wenn du in die andere Richtung schiebst wird es nicht erniedrigt.

    Eigentlich ist „position“ deine Fragmentnummer.

    Was ich nicht ganz verstehe ist
    public int getCount() {
    return content.length + 2;
    }
    Und zwar das Plus 2 hast du das eingefügt?

    Nein damit hat das nichts zu tun. Du benutzt ja auch nur ein Fragment das immer wieder geladen wird . bei deiner anfänglicher Erklärung bin ich von der Fragmenten ausgegangen die abwechselnd geladen werden


    Für mich ist das auch nicht das was du eigentlich willst denn .
    Der Code fängt mit seite 1 an „pager.setCurrentItem(1, false);“
    Wenn du nun nach rechts schiebst wird ein neues Fragment hinzugefügt usw. ein ende gibt es eigentlich nicht.
    Wenn du bei 1 bist und nach links schiebst wird zum letzen Fragment in der liste gewechselt.
     
    Zuletzt bearbeitet: 30.10.2018
  7. DjTommy79, 30.10.2018 #7
    DjTommy79

    DjTommy79 Threadstarter Neuer Benutzer

    Nein SimpleViewPagerAdapter.java ist genau so wie ich es im Internet gefunden habe.
    Ich habe als testweise h hinzugefügt
    und es ist mir klar, wenn die andere Richtung gewischt wird, das es nicht niedriger wird.
    Wie gesagt ich habe Variable h nur als testweise hinzugefügt, dadurch bin ich drauf gekommen das jede 3ten wisch zahl 3 angezeigt wird.
    Und ehrlich gesagt, mir sagt der Code gar nichts. Ich bin noch nicht genau drauf gekommen was da eigentlich passiert.
    Das alles ist Neuland für mich.
    Ich programmiere seit Jahren Visual Basic.Net und das ist auch nur selbst angelernt.
    In VB.net finde ich mich zurecht.
    Aber ich wollte auch mal Apps programmieren für mein Handy, denn Handy habe ich immer mit und PC nicht:)
    eine App habe ich schon fertig geschrieben, die Menge und Preis von diesem Produkte vergleicht.
    Und die App sagt mir, welches Produkt nehmen sollte.
    Und jetzt wollte ich ein Kalender mit Feiertage Erinnerung etc. programmieren Kalender funktioniert schon mal.
    Nur das endlos wisch, da hänge ich.
     
  8. jogimuc, 30.10.2018 #8
    jogimuc

    jogimuc Erfahrener Benutzer

    Also ich bleibe bei meiner Meinung das der viewpager nicht sonderlich geeignet ist für das was du machen willst.
    Ich würde es so machen wie ich am Anfang gesagt habe einfach die Daten tauschen und anzeigen. Dann hast du zwar keine Animation. Als Anfänger würde ich es arber erstmal so machen. Eine Animation kannst du immer noch machen wenn du etwas fitter bist.
    Den Code den ich dir zu Anfang gegeben habe ist eigentlich nichts anderes als ob du zwei Button hättest für vor und zurück. Nur das dies durch Gesten erfolgt.

    Versuche es doch wirklich erst mal so.
    Bein viewpager würdest du auch viel Speicher verbrauchen denn es würde immer eine neu seite erstellt werden. Bei jedem wisch.
     
  9. DjTommy79, 31.10.2018 #9
    DjTommy79

    DjTommy79 Threadstarter Neuer Benutzer

    Hallo!
    Da gebe, ich dir recht ich werde es mit Swipe Code machen, den du mir gegeben hast.
    Sollte ich mich mal besser damit aus kennen, kann ich es ja immer noch ändern.
    Ich möchte mich bedanke, dass du mir geholfen hast.
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
Wie verwendet man setArguments() und getArguments() in Fragments? Android App Entwicklung 07.08.2018
Fragment Textview Text von non-Activity ändern Android App Entwicklung 27.01.2018
[OFFEN] ListFragment innerhalb eines TabFragments darstellen Android App Entwicklung 02.01.2018
  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.