2017-10-11 73 views
0

讓我開始說這個我已經嘗試過從片段發送數據到另一個片斷,每次都以某種方式失敗。片段到片段通信(尋呼機適配器)

我有一個與尋呼機適配器和標籤的主要活動,我有5個片段,我需要從片段5發送數據到其餘的,我嘗試過接口和其他3種方式,我最終崩潰或出現錯誤開始。

我用接口和它的作品只是有時,爲了找到它爲什麼在某些情況下,我來到這裏,但沒有得到任何答案

提前謝謝你不工作。

主要活動:

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

}

主要活動佈局:

<?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> 

片段版本是相似

片段:

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

我使用共享偏好utils的和一切工作,除了當我去到的數據發送

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) 

這是指這種方法的頁面我得到這個錯誤:

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

片段1我得到的數據: int Riddle = SharedPreferenceUtils.getData1(getActivity());

我只有1個數據,那就是int和我正在尋找sharedprefences,我發現了很多好東西。

所以這是我在做什麼,它的工作原理:

片段5(發送數據的片段):

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

片段1(獲取數據):

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

我有一些發送整數的問題,所以我發送字符串並轉換爲int

+0

要在碎片之間發送數據,有多種方法可以實現此目的。 1.通過共享首選項實現2.創建一個靜態變量來發送數據(不推薦)。 –

+0

您應該使用接口在兩個片段之間發送數據。數據應該由活動傳遞。 https://developer.android.com/training/basics/fragments/communicating.html –

+0

請在logcat中提供錯誤。 – HaroldSer

回答

1

您可以使用SharedPreferences在你的代碼中。

試試這個。

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, ""); 
    } 
} 

使用在Frag5

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

而在其他Fragment

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

注意使用

  • 變化數據1和數據2的值你想
  • 變化getData1getData2的方法,你想
+0

謝謝你,1個小問題,即時通訊使用PagerAdapter,所以它不會立即發送數據,它需要一點時間(我從片段5到1,然後它更新數據,你知道任何解決方案嗎? – amirsoltani

+0

1.我也使用'EventBus'來更新數據。2.如果你想立即更新,當片段可見時,你可以在片段中使用'setUserVisibleHint'。 – KeLiuyue

1

其實你有很多的選擇與片段進行溝通。我想建議你CachePot - Android Simple Data Cache用於緩存數據。

首先,推送您想要傳遞的數據。

CachePot.getInstance().push(data); 

其次從CachePot彈出您的數據。

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

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

謝謝你的回答我在看它 – amirsoltani

+0

這是一個偉大的方式,我是新來的機器人,所以我試圖學習其他方式。但謝謝 – amirsoltani

+0

@amirsoltani沒問題!這是不正確的答案,選擇你想要的!祝你好運! – kimkevin