2016-06-22 4 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, saveInstanceState может проверить, истинно ли оно, а затем пропустить и показать ContactListFragment. Либо это, либо используйте SharedPreferences и сохраните там логическое значение и проверьте его из MainActivity и выполните if() else {} для showFragment (новый SplashFragment.newInstance()) или showFragment (newContactListFragment.newInstance()) –

+0

Почему бы не реализовать splashscreen в качестве темы активности и избавиться от фрагмента всплывающего экрана, чтобы вы могли убедиться, что всплывающее окно отображается до ввода mainactivity? После этого вы получите ориентацию от конфигурации. Пожалуйста, определите результат, который вы хотите, чтобы портфолио заставки отображалось в ландшафтном приложении? –

ответ

0

К точке вы звоните

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

Вы можете найти свой фрагмент из FragmentManager по телефону

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

И пример вы можете сказать быстро был фрагмент, показанный

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

Если вы вызвали метод remove(), вы не знаете, был ли показан всплеск или нет. Вы можете попробовать создать логическую систему значений, чтобы указать, что фрагмент был в 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, saveInstanceState может проверить, истинно ли оно, а затем пропустить и показать 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

В 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' назначьте 'mActivity' с помощью' getActivity(); 'теперь в вашем SplashFragment обращайтесь к mActivity, используя' MainAcitvity.mActivity' который, в свою очередь, может быть использован так: 'MainActivity.mActivity.getActivity();' –

+0

Я добавил в "mActivity' в фрагмент выше. Дайте мне знать, если это решит вашу проблему. –

+0

Спасибо, но это показывает мне ту же проблему. –