2016-06-22 82 views
0

我想知道如何知道在將方向切換爲風景之前,我的片段(啓動畫面)已經顯示。我想在改變方向之後,活動被破壞了。片段 - 更改方向

MainActivity

public class MainActivity extends AppCompatActivity { 

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

     //toolbar ... 

     showFragment(new SplashFragment()); 
    } 

    public void showFragment(Fragment fragment) { 
     getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_layout, fragment).addToBackStack("").commit(); 
    } 

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

片段(閃屏)

公共類SplashFragment擴展片段{從我的評論

public static SplashFragment newInstance() { 

    Bundle args = new Bundle(); 

    SplashFragment fragment = new SplashFragment(); 
    fragment.setArguments(args); 
    return fragment; 
} 

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

    return view; 
} 

@Override 
public void onViewCreated(View view, @Nullable final Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    ButterKnife.bind(this, view); 

    ((MainActivity) getActivity()).getSupportActionBar().hide(); 


    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      ((MainActivity) getActivity()).showFragment(ContactListFragment.newInstance()); 
     } 
    }, 1000); 
} 
+0

您的SplashFragment的處理程序完成後,您可以在捆綁中添加布爾值。因此,當調用SplashFragment時,savedInstanceState可以檢查它是否爲true,然後跳過並顯示ContactListFragment。 或者使用SharedPreferences並將布爾值存儲在那裏,並從MainActivity中檢查它並執行if()else {} showFragment(new SplashFragment.newInstance())或showFragment(newContactListFragment.newInstance()) –

+0

爲什麼不實現splashscreen作爲活動主題並擺脫splashscreen碎片,因此您可以確保在您輸入主要活動之前顯示splashscreen?之後,你將從配置中獲得定位。請在面向風景的應用程序中定義你想要肖像閃屏的結果? –

回答

0

給點之前,您可以通過調用

getFragmentManager().findFragmentByTag(/* by id or tag */) 

找到從FragmentManager您的片段和例子,你可以很快告訴顯示片段爲

getFragmentManager().findFragmentByTag(/*Id or TAG*/) != null ? fragment was added to FragmentManager : fragment is not in FragmentManager 

如果您調用remove()方法,則無法知道是否顯示了splash。你可以嘗試創建一個布爾值系統來指示是否有片段在FragmentManager中。

Android中的方向更改確實會終止活動和片段。通過正確保存活動和片段狀態下

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState) 
    //Save your stuff to bundle 
} 

,並在

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (savedInstanceState == null) return; 
    //get your stuff from savedInstanceState 
    //Example 
    boolean[] array = savedInstanceState.getBooleanArray("yourkey"); 
} 

您可以保存例如你的布爾指標恢復他們布爾[]數組並瞭解了在這個「全球」已發生生命週期

0

報價

你可以添加一個布爾值成y之後的包我們的處理程序已完成您的SplashFragment。因此,當調用SplashFragment時,savedInstanceState可以檢查它是否爲true,然後跳過並顯示ContactListFragment。如果不是這樣,使用SharedPreferences並存儲布爾在那裏,並從MainActivity檢查,如有做一個()其他{}到showFragment(新SplashFragment.newInstance())或showFragment(newContactListFragment.newInstance())

SharedPreferences的例子:

MainActivity.java

在之前的onCreate showFragment()

[...] // other activity stuff 
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 
boolean hasShown = sharedPref.getBoolean("hasShown", false); 
if(hasShown) 
{ showFragment(new ContactListFragment()); } 
else 
{ showFragment(new SplashFragment()); } 

SplashFragment.java你叫

getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 

在onViewCreated new Handler()

SharedPreferences sharedPref = ((MainActivity) getActivity()).getPreferences(Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = sharedPref.edit(); 
editor.putBoolean("hasShown", true); 
editor.commit(); 
+0

好吧,在你的MainActivity.java中創建一個公共變量'public static Activity mActivity'並在你的'onCreate'方法中用'getActivity()'賦值'mActivity';'現在在你的SplashFragment中使用'MainAcitvity.mActivity'這又可以用來像'MainActivity.mActivity.getActivity();' –

+0

我在'mActivity'中添加到上面的代碼片段中。讓我知道這是否解決您的問題。 –

+0

謝謝,但它顯示我同樣的問題。 –