2017-10-11 55 views
0

Lassen Sie mich damit beginnen, dass ich versucht habe, Daten von einem Fragment an ein anderes zu senden und jedes Mal irgendwie fehlgeschlagen.Fragment zu Fragment-Kommunikation (Pager-Adapter)

Ich habe eine Hauptaktivität mit Pager Adapter und Tabs und ich habe 5 Fragmente und ich muss Daten von Fragment 5 an den Rest von ihnen senden, habe ich Schnittstelle und 3 andere Möglichkeiten versucht, und ich am Ende Absturz oder Fehler auf Anfang.

verwendet I-Schnittstelle und es funktioniert nur manchmal und um zu finden, warum es Arbeit in einigen Fällen tut ich hierher gekommen sind, haben aber noch keine Antworten bekam

danken Ihnen im Voraus.

Hauptaktivität:

package com.redot.puzzle3; 

    import android.os.Bundle; 
    import android.support.design.widget.FloatingActionButton; 
    import android.support.design.widget.Snackbar; 
    import android.support.design.widget.TabLayout; 
    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.view.View; 
    import android.view.WindowManager; 


    public class MainActivity extends AppCompatActivity { 

    private SectionsPagerAdapter mSectionsPagerAdapter; 
    private ViewPager mViewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //Remove title bar 
    // this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    this.setContentView(R.layout.activity_main); 


    mSectionsPagerAdapter = new 
    SectionsPagerAdapter(getSupportFragmentManager()); 


    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
    mViewPager.setCurrentItem(3); 





    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 

    FloatingActionButton fab = (FloatingActionButton) 
    findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", 
    Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 

} 


    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 
     @Override 
     public int getCount() { 
      return 5; 
     } 


     @Override 
    public Fragment getItem(int arg0) { 
     switch (arg0) { 
      case 0: 
       return new Frag1(); 
      case 1: 
       return new Frag2(); 
      case 2: 
       return new Frag3(); 
      case 3: 
       return new Frag4(); 
      case 4: 
       return new Frag5(); 
      case 5: 


      default: 
      return null; 
     } 

    } 


    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: 
       return "Inventory"; 
      case 1: 
       return "3Men"; 
      case 2: 
       return "Test"; 
      case 3: 
       return "TheMan"; 
      case 4: 
       return "King"; 

     } 
     return null; 
    } 
} 

}

Hauptaktivität Layout:

<?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:id="@+id/main_content" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context="com.redot.puzzle3.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="@dimen/appbar_padding_top" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    </android.support.design.widget.AppBarLayout> 



    <android.support.v4.view.ViewPager 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 


    <android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="end|bottom" 
    android:layout_margin="@dimen/fab_margin" 
    app:srcCompat="@android:drawable/ic_dialog_email" /> 

    </android.support.design.widget.CoordinatorLayout> 

Fragmente baut sind ähnliche

Fragmente:

public class Frag1 extends Fragment { 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
      View myInflatedView = inflater.inflate(R.layout.fragment_frag1, 
    container, false); 

    return myInflatedView; 

    } 

UPDATE:

verwendet Ich teilte Vorlieben utils und alles funktionierte, außer ich diese Fehlermeldung bekam, wenn ich auf die Seite gehen, wo die Daten

10-11 04:49:13.040 6734-6734/com.redot.puzzle3 E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: com.redot.puzzle3, PID: 6734 
                  java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference 
                   at com.redot.puzzle3.SharedPreferenceUtils.getData1(SharedPreferenceUtils.java:30) 
                   at com.redot.puzzle3.Frag1.<init>(Frag1.java:19) 
                   at com.redot.puzzle3.MainActivity$SectionsPagerAdapter.getItem(MainActivity.java:71) 
                   at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:101) 
                   at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1005) 
                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1153) 
                   at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:665) 
                   at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:627) 
                   at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:608) 
                   at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:2169) 
                   at android.support.design.widget.TabLayout.dispatchTabSelected(TabLayout.java:1164) 
                   at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1157) 
                   at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1127) 
                   at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1426) 
                   at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1536) 
                   at android.view.View$PerformClick.run(View.java:21179) 
                   at android.os.Handler.handleCallback(Handler.java:739) 
                   at android.os.Handler.dispatchMessage(Handler.java:95) 
                   at android.os.Looper.loop(Looper.java:145) 
                   at android.app.ActivityThread.main(ActivityThread.java:6873) 
                   at java.lang.reflect.Method.invoke(Native Method) 
                   at java.lang.reflect.Method.invoke(Method.java:372) 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

gesendet wird, die diesem Verfahren bezieht sich:

public static int getData1(Context context) { 
    SharedPreferences sp = context.getSharedPreferences(SP_NAME, 
    Context.MODE_PRIVATE); 
    return sp.getInt(DATA1, x); 
} 

Fragment 1 wobei i die Daten erhalten: int Riddle = SharedPreferenceUtils.getData1 (getActivity());

Ich habe nur 1 Daten und das ist Int und ich suchte nach Shared Prefences und ich fand viele gute Sachen.

So ist es das, was ich tue, und es funktioniert:

Fragment 5 (das Fragment, das die Daten sendet):

Context context = getActivity(); 
    SharedPreferences SU = context.getSharedPreferences(
      "Riddle", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor= SU.edit(); 
    editor.putString("riddle",""+riddle); 
    editor.commit(); 

Fragment 1 (bekommt die Daten):

 Context context = getActivity(); 
     SharedPreferences SU = context.getSharedPreferences(
      "Riddle", Context.MODE_PRIVATE); 
      Riddle= Integer.parseInt(SU.getString("riddle","")); 

Ich hatte ein paar Probleme mit dem Senden von Ints, also habe ich eine Zeichenfolge gesendet und in int konvertiert

+0

Um Daten zwischen Fragmenten zu senden, gibt es mehrere Möglichkeiten, dies zu erreichen. 1. Implementieren durch gemeinsame Voreinstellung 2. Erstellen Sie eine statische Variable, um die Daten zu senden (nicht empfohlen). –

+0

Sie sollten Daten zwischen zwei Fragmenten über eine Schnittstelle senden. Die Daten sollten von der Aktivität übergeben werden. https://developer.android.com/training/basics/fragments/communicating.html –

+0

Bitte Fehler in Logcat. – HaroldSer

Antwort

1

Sie könnenverwendenin Ihrem Code.

Versuchen Sie es.

public class SharedPreferenceUtils { 

    private static final String SP_NAME = "sp"; 
    public static final String DATA1 = "data1"; 
    public static final String DATA2 = "data2"; 


    // create 
    public static boolean createSP(Context context, String data1, String data2) { 
     SharedPreferences.Editor editor = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE).edit(); 
     editor.putString(DATA1, data1); 
     editor.putString(DATA2, data2); 
     return editor.commit(); 
    } 

    // clear 
    public static void clearSP(Context context) { 
     SharedPreferences sharedPreferences = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.clear().apply(); 
    } 

    // get access info 
    public static String getData1(Context context) { 
     SharedPreferences sp = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE); 
     return sp.getString(DATA1, ""); 
    } 
    // get branch info 
    public static String getData2(Context context) { 
     SharedPreferences sp = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE); 
     return sp.getString(DATA2, ""); 
    } 
} 

Verwendung in Frag5

SharedPreferenceUtils.createSP(getActivity(),data1,data2); 

Und Fragment

in anderen verwenden
String data1 = SharedPreferenceUtils.getData1(getActivity()); 
String data2 = SharedPreferenceUtils.getData2(getActivity()); 

Hinweis

  • Änderung data1 und Daten2 den Wert mögen Sie
  • Änderung getData1 und getData2 die Methode Sie
  • wollen
+0

Danke Mann, 1 kleines Problem tho im PagerAdapter verwenden, so dass es nicht die Daten senden sofort dauert es ein bisschen Zeit (ich gehe von Fragment 5 zu 1 dann aktualisiert es die Daten kennen Sie irgendeine Lösung? – amirsoltani

+0

1.Ich benutze auch 'EventBus', um die Daten zu aktualisieren .2.Auch wenn Sie jetzt aktualisieren möchten, wenn das Fragment sichtbar ist, können Sie 'setUserVisibleHint' im Fragment verwenden. – KeLiuyue

1

Eigentlich Sie eine Menge von Optionen mit Fragmenten zu kommunizieren. Ich möchte Ihnen CachePot - Android Simple Data Cache zum Caching von Daten vorschlagen.

Zunächst drücken Sie die Daten, die Sie übergeben möchten.

CachePot.getInstance().push(data); 

Zweite Ihre Daten aus Cachepot Pop.

public class MainFragment extends Fragment{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Data data = CachePot.getInstance().pop(Data.class); 
    } 
+0

Vielen Dank für Ihre Antwort im Blick – amirsoltani

+0

Das ist ein guter Weg, ich bin neu in Android, also versuche ich, andere Wege zu lernen Aber danke – amirsoltani

+0

@amirsoltani Kein Problem! Es ist nicht die richtige Antwort, wählen Sie, was Sie wollen! Viel Glück! – kimkevin

Verwandte Themen