2015-06-14 31 views
0

在我的屏幕上,我有2個容器 - 在視圖尋呼機中留下3個片段,右側爲單個片段。從這個右邊我增加一些臨時變量,並通過inteface我傳遞這個變量爲片段。我在視圖尋呼機中切換片段,一切似乎都行得通。但是,有兩個問題。片段之間的相互作用緩慢刷新

首先是當我啓動我的應用程序,並嘗試實現視圖分頁器中的第三個片段中的臨時變量時,有NPE。當然它應該是,因爲在這一點上,第三個片段沒有被初始化(查看尋呼機只能初始化實際的片段和他側面的片段,以便能夠在片段之間滑動)。我如何初始化開始時的第三個片段?我以爲我可以暫時將數據存儲在第二個片段中,當第二個片段初始化時,我可以將數據傳遞給第三個,但似乎不是很好的解決方案。

第二個問題是,當我通過滑動它來初始化所有片段時,我回到第一個片段視圖已經消失(但已初始化)。當我實現temp變量並且滑動到第三個片段時,我可以看到這個變量,但是在+ - 一秒之後。有人可以解釋我爲什麼嗎?如果沒有這方面的知識我解決不了這個問題:/

這裏有我的一些代碼:

public class ThirdFragment extends Fragment { 

View thisView; 
TextView tempTextView; 
String iterator; 

public AchievFragment() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    iterator = "Start"; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    thisView = inflater.inflate(R.layout.fragment_third, container, false); 

    tempTextView= (TextView) thisView.findViewById(R.id.tempTextView); 
    tempTextView.setText(iterator); 

    return thisView; 
} 

public void getVariable(String text) { 
    iterator = text; 
    tempTextView.setText(iterator); 
} 

所以這是第三個片段類。在開始時,我初始化迭代器(它是這個臨時變量)作爲一個全局變量,以避免初始化片段後的npe。在onCreateView中,我將TextView的視圖設置爲此變量的值。應該可以正常工作,但是這個+ 1秒的偏移量讓我很難過。

我認爲這個代碼示例應該足夠了,剩下的就是我想的標準了,但是如果任何人都會真的感興趣,我會過去其餘的。

我真的希望你能理解我剛寫的東西。

這裏是主(主機)活動碼:

public class MainActivity extends AppCompatActivity implements OnFragmentInteractionListener { 

ViewPager mViewPager; 
FragmentPageAdapter ft; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mViewPager = (ViewPager) findViewById(R.id.pager_container); 
    ft = new FragmentPageAdapter(getSupportFragmentManager()); 
    mViewPager.setAdapter(ft); 

    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    RightFragment gameFragment = new RightFragment(); 
    ft.replace(R.id.rightFragment_container, rightFragment,"RightFragment"); 
    ft.commit(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void OnUpdateFirst(String text) { 
    FirstFragment firstFragment = (FirstFragment) ft.instantiateItem(mViewPager,0); 
    firstFragment.getVariable(text); 
} 

@Override 
public void OnUpdateSecond(String text) { 
    SecondFragment secondFragment = (SecondFragment) ft.instantiateItem(mViewPager,1); 
    secondFragment.getVariable(text); 
} 

@Override 
public void OnUpdateThird(String text) { 
    ThirdFragment thirdFragment = (ThirdFragment) ft.instantiateItem(mViewPager,2); 
    thirdFragment.getVariable(text); 
} 

}

片段頁適配器代碼:

public class FragmentPageAdapter extends FragmentPagerAdapter { 

public FragmentPageAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int arg0) { 

    switch (arg0) 
    { 
     case 0: 
      return new FirstFragment(); 
     case 1: 
      return new SecondFragment(); 
     case 2: 
      return new ThirdFragment(); 
     default: 
      break; 
    } 
    return null; 
} 

@Override 
public int getCount() { 
    return 3; 
} 

厚望當我嘗試我之前具體化在第三個片段變量初始化它(例如在我啓動應用程序之後)

06-14 16:47:25.621 27246-27246/com.package.app E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.NullPointerException 
     at com.package.app.ThirdFragment.getVariable(ThirdFragment.java:37) 
     at com.package.app.MainActivity.OnUpdateThird(MainActivity.java:59) 
     at com.package.app.RightFragment$3.onClick(RightFragment.java:57) 
     at android.view.View.performClick(View.java:4101) 
     at android.view.View$PerformClick.run(View.java:17082) 
     at android.os.Handler.handleCallback(Handler.java:615) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4940) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
     at dalvik.system.NativeStart.main(Native Method) 
+1

請將您的託管活動代碼以及您的例外日誌 –

+0

@OlegOsipenko我根據需要發佈了託管活動代碼和例外日誌。 –

回答

1

至於你的第一個問題,你可以在初始化你的ViewPager權限後調用setOffscreenPageLimit(2)方法。默認情況下,它被設置爲1,這意味着適配器將創建一個頁面,該頁面現在位於屏幕上,另一個位於下一個頁面。

+0

奧基,這個「詭計」解決了我的兩個問題。非常感謝你。 Anywya,如果有人知道,並可以解釋爲什麼第二件事出現,我將不勝感激;) –