2016-11-05 3 views
2

У меня есть FrameLayout и на нем есть фрагменты, щелкнув по кнопке, следующий щелчок должен удалить фрагмент из FrameLayout, я делаю это с помощью removeAllViews() (FrameLayout находится в другом фрагменте, поэтому метод трансляции находится в Activity). Мне нужно сделать какое-то действие, когда начинается removeAllViews(), и нужно сделать это в классе Фрагментов, но что-то не так.Android, когда фрагмент удален

Я пробовал: OnDestroy() OnDestroyView() OnPause() в классе Фрагмент

, но он работает как:

  1. пут Фрагмент в FrameLayout (от деятельности)
  2. использования removeAllViews() (от деятельности)
  3. нет фрагмента в FrameLayout (есть c Лир), но ничего не происходит, и методы не работают
  4. поставить новый фрагмента в FrameLayout (от активности) - теперь все методы (OnDestroy() из класса Fragment) работает (возможно, это в режиме реальное время для destroy старого фрагмента)

Как можно «получить момент», когда Фрагмент не существует для пользователя? Я хочу отправить некоторую информацию на сервер, если пользователь скрывает фрагмент.

@ EDIT3 кода из метода от деятельности, где я хочу, чтобы сделать translaction

public void showProductsList(String productType,int containerID){ 

     List<String> prodNames = new ArrayList<String>(); 
     List<Long> prodIds = new ArrayList<Long>(); 

      DatabaseDAOProdProtein dao = new DatabaseDAOProdProtein(getApplicationContext()); 
      dao.open(); 
      List<DatabaseProduct> productList = dao.getAllProducts(); 
      for(int i=0;i<productList.size();i++){ 
       prodNames.add(productList.get(i).getName()); 
       prodIds.add(productList.get(i).getId()); 
      } 
      dao.close(); 

     ProductsList productsList = new ProductsList(productType,prodNames,prodIds); 

     productsList.setOnSystemUiVisibilityChangeListener 
       (new View.OnSystemUiVisibilityChangeListener() { 
        @Override 
        public void onSystemUiVisibilityChange(int visibility) { 
         // Note that system bars will only be "visible" if none of the 
         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set. 
         Toast.makeText(getApplicationContext(),"action1 " ,Toast.LENGTH_LONG).show(); 
         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
          // TODO: The system bars are visible. Make any desired 
          // adjustments to your UI, such as showing the action bar or 
          // other navigational controls. 
          Toast.makeText(getApplicationContext(),"action2 " ,Toast.LENGTH_LONG).show(); 
         } else { 
          // TODO: The system bars are NOT visible. Make any desired 
          // adjustments to your UI, such as hiding the action bar or 
          // other navigational controls. 
          Toast.makeText(getApplicationContext(),"action3 " ,Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 

     FragmentManager manager = getSupportFragmentManager(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     transaction.replace(containerID, productsList).commit(); 
    } 

Я использовал этот метод в другом фрагменте с помощью:

((MainActivity) getContext()).showProductsList("carb", carbContainer.getId());

Существует ошибка:

Error:(560, 21) error: cannot find symbol method setOnSystemUiVisibilityChangeListener(<anonymous OnSystemUiVisibilityChangeListener>)

ответ

1

Вы говорите:

"How is it possible to 'get moment' when Fragment is not exists for user? I want to send some information to server if user hides Fragment."

теперь я знаю, что ты не имел в виду «скрыть», так что просто использовать метод OnDestroy().

Попробуйте это, чтобы вызвать «шкурку»

View topLevelLayout = findViewById(R.id.top_layout); 
topLevelLayout.setVisibility(View.INVISIBLE); 

Вы не можете войти в остановленном состоянии в то время как фрагмент (активность) видна. Android destroying activities, killing processes

Лучший способ убедиться, что что-то работает через вид, чтобы запустить его с помощью поста:

topLevelLayout.post(new Runnable() 
{ 
@Override 
public void run() 
{ 
     topLevelLayout.removeAllViews(); 
    } 
} 

Для получения уведомлений об изменениях видимости системы пользовательского интерфейса, зарегистрировать View.OnSystemUiVisibilityChangeListener к вашему view (фрагмент).

https://developer.android.com/training/system-ui/visibility.html

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Toast.makeText(getContext(),"action0 " ,Toast.LENGTH_LONG).show(); 
    Fragment your_frag = new ProductsList(productType,prodNames,prodIds); 
getSupportFragmentManager().beginTransaction().replace(containerID,your_frag).commit(); 
    getSupportFragmentManager().executePendingTransactions();//make sure onCreateView has executed 
     your_frag.getRootView().setOnSystemUiVisibilityChangeListener 
       (new View.OnSystemUiVisibilityChangeListener() { 
        @Override 
        public void onSystemUiVisibilityChange(int visibility) { 
         // Note that system bars will only be "visible" if none of the 
         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set. 
         Toast.makeText(getContext(),"action1 " ,Toast.LENGTH_LONG).show(); 
         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
          // TODO: The system bars are visible. Make any desired 
          // adjustments to your UI, such as showing the action bar or 
          // other navigational controls. 
          Toast.makeText(getContext(),"action2 " ,Toast.LENGTH_LONG).show(); 
         } else { 
          // TODO: The system bars are NOT visible. Make any desired 
          // adjustments to your UI, such as hiding the action bar or 
          // other navigational controls. 
          Toast.makeText(getContext(),"action3 " ,Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 
    }  

Типичный фрагмент выглядит следующим образом:

public class HomeFragment extends Fragment { 
    View      mRootView  = null; 
    public HomeFragment(){}//null constructor 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     mRootView = inflater.inflate(R.layout.fragment_home, container, false); 

     return mRootView ; 
    } 
public View getRootView() 
{ 
    return mRootView; 
} 
} 
+0

Я не пробовал, но до сих пор ничего (код в моем посте) – barmi

+0

Поместите приемник на своем фрагменте при ее создании (rootView). –

+0

Я создаю его в Activity (редактировал мой пост снова). Не могли бы вы объяснить мне, как подать слушателя, пожалуйста? – barmi

Смежные вопросы