2016-06-22 81 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

谢谢,但它显示我同样的问题。 –