Как определить, когда фрагмент становится видимым в ViewPager -- android поле с участием android-fragments поле с участием android-viewpager пол Связанный проблема

How to determine when Fragment becomes visible in ViewPager


779
vote

проблема

русский

Проблема: фрагмент <код> onResume() в <Код> ViewPager уволен до того, как фрагмент становится на самом деле видимым.

Например, у меня есть 2 фрагмента с <код> ViewPager и <код> FragmentPagerAdapter . Второй фрагмент доступен только для авторизованных пользователей, и мне нужно попросить пользователя войти в систему, когда фрагмент становится видимым (используя диалоговое окно оповещения).

Но ViewPager создает второй фрагмент, когда первый видимый для того, чтобы кэшировать второй фрагмент и делает его видимым, когда пользователь начинает проводить прослушивание.

Так что onResume() событие уволено во втором фрагменте задолго до того, как оно становится видимым. Вот почему я пытаюсь найти событие, которое стреляет, когда второй фрагмент становится видимым, чтобы показать диалог в соответствующий момент.

Как это можно сделать?

Английский оригинал

Problem: Fragment onResume() in ViewPager is fired before the fragment becomes actually visible.

For example, I have 2 fragments with ViewPager and FragmentPagerAdapter. The second fragment is only available for authorized users and I need to ask the user to log in when the fragment becomes visible (using an alert dialog).

BUT the ViewPager creates the second fragment when the first is visible in order to cache the second fragment and makes it visible when the user starts swiping.

So the onResume() event is fired in the second fragment long before it becomes visible. That's why I'm trying to find an event which fires when the second fragment becomes visible to show a dialog at the appropriate moment.

How can this be done?

</div
        
         
         

Список ответов

591
 
vote
vote
Лучший ответ
 

Как определить, когда фрагмент становится видимым в ViewPager

Вы можете сделать следующее, переопределение <код> const tzn = moment().tz(zone).format('DD-MMM-YYYY HH:mm:ss Z'); 2 в вашем <код> const tzn = moment().tz(zone).format('DD-MMM-YYYY HH:mm:ss Z'); 3 :

 <код> const tzn = moment().tz(zone).format('DD-MMM-YYYY HH:mm:ss Z'); 4  
 

How to determine when Fragment becomes visible in ViewPager

You can do the following by overriding setUserVisibleHint in your Fragment:

public class MyFragment extends Fragment {     @Override     public void setUserVisibleHint(boolean isVisibleToUser) {         super.setUserVisibleHint(isVisibleToUser);         if (isVisibleToUser) {         }         else {         }     } } 
</div
 
 
       
       
530
 
vote

Обновление : Библиотека поддержки Android (Rev 11), наконец, Исправлен пользователь Видимая проблема соска , теперь, если вы используете библиотеку поддержки для фрагментов, вы можете безопасно использовать <код> getUserVisibleHint() или переопределения <код> setUserVisibleHint() для захвата изменений, как описано ответом Gorn.

<Сильное> Обновление 1 Вот одна небольшая проблема с <Код> getUserVisibleHint() . Это значение по умолчанию <код> true .

 <код> // Hint provided by the app that this fragment is currently visible to the user. boolean mUserVisibleHint = true;   

Так что может быть проблема, когда вы пытаетесь использовать его до <код> setUserVisibleHint() . Как обходной путь, вы можете установить значение onCreate метода.

 <код> public void onCreate(@Nullable Bundle savedInstanceState) {     setUserVisibleHint(false);   

устаревший ответ:

В большинстве случаев использования

в большинстве случаев использования <код> ViewPager показывают только одну страницу за раз, но предварительно кэшированные фрагменты также помещают в «видимое» состояние (на самом деле невидимое), если вы используете <код> FragmentStatePagerAdapter в <код> setUserVisibleHint()0 .

Я переопределил:

 <код> setUserVisibleHint()1  

Чтобы захватить фокус состояния фрагмента, который, я думаю, является наиболее подходящим состоянием «видимости», вы имеете в виду, поскольку только один фрагмент в ViewPager может фактически разместить его пункты меню вместе с элементами родительской деятельности.

 

UPDATE: Android Support Library (rev 11) finally fixed the user visible hint issue, now if you use support library for fragments, then you can safely use getUserVisibleHint() or override setUserVisibleHint() to capture the changes as described by gorn's answer.

UPDATE 1 Here is one small problem with getUserVisibleHint(). This value is by default true.

// Hint provided by the app that this fragment is currently visible to the user. boolean mUserVisibleHint = true; 

So there might be a problem when you try to use it before setUserVisibleHint() was invoked. As a workaround you might set value in onCreate method like this.

public void onCreate(@Nullable Bundle savedInstanceState) {     setUserVisibleHint(false); 

The outdated answer:

In most use cases, ViewPager only show one page at a time, but the pre-cached fragments are also put to "visible" state (actually invisible) if you are using FragmentStatePagerAdapter in Android Support Library pre-r11.

I override :

public class MyFragment extends Fragment {     @Override     public void setMenuVisibility(final boolean visible) {         super.setMenuVisibility(visible);         if (visible) {             // ...         }     }    // ... } 

To capture the focus state of fragment, which I think is the most suitable state of the "visibility" you mean, since only one fragment in ViewPager can actually place its menu items together with parent activity's items.

</div
 
 
       
       
142
 
vote

Это, кажется, восстанавливает нормальный <код> setUserVisibleHint()2 поведение, которое вы ожидаете. Он хорошо воспроизводится с нажатием клавиши домой, чтобы покинуть приложение, а затем повторно ввести приложение. <Код> setUserVisibleHint()3 не вызывается дважды подряд.

 <код> setUserVisibleHint()4  
 

This seems to restore the normal onResume() behavior that you would expect. It plays well with pressing the home key to leave the app and then re-entering the app. onResume() is not called twice in a row.

@Override public void setUserVisibleHint(boolean visible) {     super.setUserVisibleHint(visible);     if (visible && isResumed())     {         //Only manually call onResume if fragment is already visible         //Otherwise allow natural fragment lifecycle to call onResume         onResume();     } }  @Override public void onResume() {     super.onResume();     if (!getUserVisibleHint())     {         return;     }      //INSERT CUSTOM CODE HERE } 
</div
 
 
         
         
71
 
vote

Вот другой способ, используя <код> setUserVisibleHint()5 :

 <код> setUserVisibleHint()6  
 

Here is another way using onPageChangeListener:

  ViewPager pager = (ViewPager) findByViewId(R.id.viewpager);   FragmentPagerAdapter adapter = new FragmentPageAdapter(getFragmentManager);   pager.setAdapter(adapter);   pager.setOnPageChangeListener(new OnPageChangeListener() {    public void onPageSelected(int pageNumber) {     // Just define a callback method in your fragment and call it like this!      adapter.getItem(pageNumber).imVisible();    }    public void onPageScrolled(int arg0, float arg1, int arg2) {     // TODO Auto-generated method stub    }    public void onPageScrollStateChanged(int arg0) {     // TODO Auto-generated method stub    } }); 
</div
 
 
         
         
58
 
vote

<Код> setUserVisibleHint() вызывается иногда перед <код> onCreateView() а иногда и после чего вызывает проблемы.

Чтобы преодолеть это, вам нужно проверить <код> isResumed() , а также внутри <код> setUserVisibleHint() метода. Но в этом случае я понял setUserVisibleHint() вызывается только , если фрагмент возобновляется и видимым, не при создании.

Так что, если вы хотите что-то обновить, когда фрагмент <код> visible , поместите свою функцию обновления как в <Код> onCreate() и <код> setUserVisibleHint() :

 <код> @Override public View onCreateView(...){     ...     myUIUpdate();     ...         }   .... @Override public void setUserVisibleHint(boolean visible){     super.setUserVisibleHint(visible);     if (visible && isResumed()){         myUIUpdate();     } }   

Обновление: все еще я понял <код> myUIUpdate() вызывается дважды, причина в том, что причина в том, что если у вас есть 3 вкладка, и этот код на 2-й вкладке, когда вы впервые открыты 1-й Вкладка, 2-я вкладка также создана даже не видимая и называется <код> onCreateView()0 . Затем, когда вы прогуливаетесь к 2-й вкладке, <код> onCreateView()1 из <код> onCreateView()2 называется и в результате <код> onCreateView()3 может вызывать вызов дважды за секунду.

Другой Проблема <код> onCreateView()4 в <код> onCreateView()5 вызывается как 1), когда вы выходите из экрана фрагмента и 2) , когда вы впервые переключаетесь на экран фрагмента.

<Сильное> Решение:

 <код> onCreateView()6  

<Сильные> Объяснение:

<Код> onCreateView()7 , <код> onCreateView()8 : гарантирует <код> onCreateView()9 в <Код> isResumed()0 называется только при создании фрагмента и видимого, не по резюме. Это также решает проблему, когда вы находитесь на 1-й вкладке, 2-й вкладки создана, даже если она не видима. Это решает, что и проверяет, виден ли фрагментный экран, когда <код> isResumed()1 .

<Код> isResumed()2 : Убедитесь, что фрагмент не виден, и не вызывается, когда вы впервые создаете фрагмент. Так что теперь это, если пункт только вызывается только при промежуточном фрагменте.

<Сильное> Обновление Вы можете поставить все этот код в <Код> isResumed()3 Код Вроде этот метод и переопределения ,

 

setUserVisibleHint() gets called sometimes before onCreateView() and sometimes after which causes trouble.

To overcome this you need to check isResumed() as well inside setUserVisibleHint() method. But in this case i realized setUserVisibleHint() gets called only if Fragment is resumed and visible, NOT when Created.

So if you want to update something when Fragment is visible, put your update function both in onCreate() and setUserVisibleHint():

@Override public View onCreateView(...){     ...     myUIUpdate();     ...         }   .... @Override public void setUserVisibleHint(boolean visible){     super.setUserVisibleHint(visible);     if (visible && isResumed()){         myUIUpdate();     } } 

UPDATE: Still i realized myUIUpdate() gets called twice sometimes, the reason is, if you have 3 tabs and this code is on 2nd tab, when you first open 1st tab, the 2nd tab is also created even it is not visible and myUIUpdate() is called. Then when you swipe to 2nd tab, myUIUpdate() from if (visible && isResumed()) is called and as a result,myUIUpdate() may get called twice in a second.

The other problem is !visible in setUserVisibleHint gets called both 1) when you go out of fragment screen and 2) before it is created, when you switch to fragment screen first time.

Solution:

private boolean fragmentResume=false; private boolean fragmentVisible=false; private boolean fragmentOnCreated=false; ...  @Override public View onCreateView(...){     ...     //Initialize variables     if (!fragmentResume && fragmentVisible){   //only when first time fragment is created         myUIUpdate();     }     ...         }  @Override public void setUserVisibleHint(boolean visible){     super.setUserVisibleHint(visible);     if (visible && isResumed()){   // only at fragment screen is resumed         fragmentResume=true;         fragmentVisible=false;         fragmentOnCreated=true;         myUIUpdate();     }else  if (visible){        // only at fragment onCreated         fragmentResume=false;         fragmentVisible=true;         fragmentOnCreated=true;     }     else if(!visible && fragmentOnCreated){// only when you go out of fragment screen         fragmentVisible=false;         fragmentResume=false;     } } 

Explanation:

fragmentResume,fragmentVisible: Makes sure myUIUpdate() in onCreateView() is called only when fragment is created and visible, not on resume. It also solves problem when you are at 1st tab, 2nd tab is created even if it is not visible. This solves that and checks if fragment screen is visible when onCreate.

fragmentOnCreated: Makes sure fragment is not visible, and not called when you create fragment first time. So now this if clause only gets called when you swipe out of fragment.

Update You can put all this code in BaseFragment code like this and override method.

</div
 
 
 
 
33
 
vote

в <Код> isResumed()4 и <код> isResumed()5 из версии <код> isResumed()6 Вы можете просто использовать <код> isResumed()7 и <код> isResumed()8 Код> Обратные вызовы, чтобы определить, какой фрагмент в настоящее время виден для пользователя. <Код> isResumed()9 обратный вызов вызывается, когда фрагмент стал видимым и <код> setUserVisibleHint()0 , когда он останавливается видимым.

В случае ViewPager2 это поведение по умолчанию, но одно и то же поведение может быть включено для старого хорошего setUserVisibleHint()1 .

Чтобы включить это поведение в первом ViewPager, вы должны пройти <код> setUserVisibleHint()2 параметра в качестве второго аргумента <код> setUserVisibleHint()3 конструктора.

 <код> setUserVisibleHint()4  

Примечание: <код> setUserVisibleHint()5 Метод и <код> setUserVisibleHint()6 Конструктор с одним параметром теперь устаревают в новой версии фрагмента с Android jetpack.

 

In ViewPager2 and ViewPager from version androidx.fragment:fragment:1.1.0 you can just use onPause and onResume callbacks to determine which fragment is currently visible for the user. onResume callback is called when fragment became visible and onPause when it stops to be visible.

In case of ViewPager2 it is default behavior but the same behavior can be enabled for old good ViewPager easily.

To enable this behavior in the first ViewPager you have to pass FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT parameter as second argument of FragmentPagerAdapter constructor.

FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) 

Note: setUserVisibleHint() method and FragmentPagerAdapter constructor with one parameter are now deprecated in the new version of Fragment from android jetpack.

</div
 
 
         
         
28
 
vote

Чтобы обнаружить <код> Fragment в <код> ViewPager видимый, я совершенно уверен, что только с использованием setUserVisibleHint недостаточно ,
. Вот мое решение, чтобы проверить, виден ли фрагмент или невидимый. Сначала при запуске ViewPager переключитесь между страницей, перейдите в другое действие / фрагмент / фон / передний план.

 <код> public class BaseFragmentHelpLoadDataWhenVisible extends Fragment {     protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that      /**      * This method will be called when viewpager creates fragment and when we go to this fragment background or another activity or fragment      * NOT called when we switch between each page in ViewPager      */     @Override     public void onStart() {         super.onStart();         if (mIsVisibleToUser) {             onVisible();         }     }      @Override     public void onStop() {         super.onStop();         if (mIsVisibleToUser) {             onInVisible();         }     }      /**      * This method will called at first time viewpager created and when we switch between each page      * NOT called when we go to background or another activity (fragment) when we go back      */     @Override     public void setUserVisibleHint(boolean isVisibleToUser) {         super.setUserVisibleHint(isVisibleToUser);         mIsVisibleToUser = isVisibleToUser;         if (isResumed()) { // fragment have created             if (mIsVisibleToUser) {                 onVisible();             } else {                 onInVisible();             }         }     }      public void onVisible() {         Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show();     }      public void onInVisible() {         Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show();     } }   

<Сильное> Объяснение Вы можете тщательно проверить logcat ниже, чем я думаю, что вы можете знать, почему это решение будет работать

<Сильный> первый запуск

 <код> Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=false Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=false Fragment3: setUserVisibleHint: isVisibleToUser=false isResumed=false Fragment1: setUserVisibleHint: isVisibleToUser=true isResumed=false // AT THIS TIME isVisibleToUser=true but fragment still not created. If you do something with View here, you will receive exception Fragment1: onCreateView Fragment1: onStart mIsVisibleToUser=true Fragment2: onCreateView Fragment3: onCreateView Fragment2: onStart mIsVisibleToUser=false Fragment3: onStart mIsVisibleToUser=false   

<Сильные> Перейти к странице2

 <код> Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=true Fragment2: setUserVisibleHint: isVisibleToUser=true isResumed=true   

Перейти к странице3

 <код> Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=true Fragment3: setUserVisibleHint: isVisibleToUser=true isResumed=true   

<Сильные> Перейти к фону:

 <код> Fragment1: onStop mIsVisibleToUser=false Fragment2: onStop mIsVisibleToUser=false Fragment3: onStop mIsVisibleToUser=true   

<Сильные> Перейти на передний план

 <код> Fragment1: onStart mIsVisibleToUser=false Fragment2: onStart mIsVisibleToUser=false Fragment3: onStart mIsVisibleToUser=true   

Demo Project здесь

Надеюсь, это поможет

 

To detect Fragment in ViewPager visible, I'm quite sure that only using setUserVisibleHint is not enough.
Here is my solution to check if a fragment is visible or invisible. First when launching viewpager, switch between page, go to another activity/fragment/ background/foreground`

public class BaseFragmentHelpLoadDataWhenVisible extends Fragment {     protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that      /**      * This method will be called when viewpager creates fragment and when we go to this fragment background or another activity or fragment      * NOT called when we switch between each page in ViewPager      */     @Override     public void onStart() {         super.onStart();         if (mIsVisibleToUser) {             onVisible();         }     }      @Override     public void onStop() {         super.onStop();         if (mIsVisibleToUser) {             onInVisible();         }     }      /**      * This method will called at first time viewpager created and when we switch between each page      * NOT called when we go to background or another activity (fragment) when we go back      */     @Override     public void setUserVisibleHint(boolean isVisibleToUser) {         super.setUserVisibleHint(isVisibleToUser);         mIsVisibleToUser = isVisibleToUser;         if (isResumed()) { // fragment have created             if (mIsVisibleToUser) {                 onVisible();             } else {                 onInVisible();             }         }     }      public void onVisible() {         Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show();     }      public void onInVisible() {         Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show();     } } 

EXPLANATION You can check the logcat below carefully then I think you may know why this solution will work

First launch

Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=false Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=false Fragment3: setUserVisibleHint: isVisibleToUser=false isResumed=false Fragment1: setUserVisibleHint: isVisibleToUser=true isResumed=false // AT THIS TIME isVisibleToUser=true but fragment still not created. If you do something with View here, you will receive exception Fragment1: onCreateView Fragment1: onStart mIsVisibleToUser=true Fragment2: onCreateView Fragment3: onCreateView Fragment2: onStart mIsVisibleToUser=false Fragment3: onStart mIsVisibleToUser=false 

Go to page2

Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=true Fragment2: setUserVisibleHint: isVisibleToUser=true isResumed=true 

Go to page3

Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=true Fragment3: setUserVisibleHint: isVisibleToUser=true isResumed=true 

Go to background:

Fragment1: onStop mIsVisibleToUser=false Fragment2: onStop mIsVisibleToUser=false Fragment3: onStop mIsVisibleToUser=true 

Go to foreground

Fragment1: onStart mIsVisibleToUser=false Fragment2: onStart mIsVisibleToUser=false Fragment3: onStart mIsVisibleToUser=true 

DEMO project here

Hope it help

</div
 
 
   
   
26
 
vote
 <код> package com.example.com.ui.fragment;   import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;  import com.example.com.R;  public class SubscribeFragment extends Fragment {      @Override     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {         View view = inflater.inflate(R.layout.fragment_subscribe, container, false);         return view;     }      @Override     public void setUserVisibleHint(boolean isVisibleToUser) {         super.setUserVisibleHint(isVisibleToUser);          if (isVisibleToUser) {             // called here         }     }      @Override     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {         super.onViewCreated(view, savedInstanceState);     } }   
 
package com.example.com.ui.fragment;   import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;  import com.example.com.R;  public class SubscribeFragment extends Fragment {      @Override     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {         View view = inflater.inflate(R.layout.fragment_subscribe, container, false);         return view;     }      @Override     public void setUserVisibleHint(boolean isVisibleToUser) {         super.setUserVisibleHint(isVisibleToUser);          if (isVisibleToUser) {             // called here         }     }      @Override     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {         super.onViewCreated(view, savedInstanceState);     } } 
</div
 
 
 
 
17
 
vote

Переопределить <код> ViewPager0 в <код> ViewPager1 subclass. Я использую этот метод, и он хорошо работает.

 <код> ViewPager2  
 

Override setPrimaryItem() in the FragmentPagerAdapter subclass. I use this method, and it works well.

@Override public void setPrimaryItem(ViewGroup container, int position, Object object) {     // This is what calls setMenuVisibility() on the fragments     super.setPrimaryItem(container, position, object);      if (object instanceof MyWhizBangFragment) {         MyWhizBangFragment fragment = (MyWhizBangFragment) object;         fragment.doTheThingYouNeedToDoOnBecomingVisible();     } } 
</div
 
 
     
     
12
 
vote

Переопределить <код> ViewPager3 Для этого.

<Код> ViewPager4

вызвано, когда скрытое состояние (как возвращено <код > ViewPager5 ) фрагмента изменился. Фрагменты начинаются не скрыты; Это будет называться всякий раз, когда фрагмент меняет состояние из этого.

Параметры
<Код> ViewPager6 - <код> ViewPager7 : true, если фрагмент теперь скрыт, false, если он не виден.

 

Override Fragment.onHiddenChanged() for that.

public void onHiddenChanged(boolean hidden)

Called when the hidden state (as returned by isHidden()) of the fragment has changed. Fragments start out not hidden; this will be called whenever the fragment changes state from that.

Parameters
hidden - boolean: True if the fragment is now hidden, false if it is not visible.

</div
 
 
         
         
5
 
vote

Только это работало для меня !! и <код> ViewPager8 теперь устарели (я прикреплен документы в конце), что означает, что любой другой ответ устарел; -)

 <Код> ViewPager9  

Испытано и работает с <код> setUserVisibleHint0 , а также Там <код> setUserVisibleHint1 всегда будет возвращаться <код> setUserVisibleHint2 (и <код> setUserVisibleHint3 , но мы хотим поддерживать <код> setUserVisibleHint4 тоже). < / P >.

<Код> setUserVisibleHint5 устарел. Если переопределение этого метода, поведение, реализованное при прохождении <код> setUserVisibleHint6 должно быть перемещено в <код> setUserVisibleHint7 , а поведение, реализованное при прохождении <код> setUserVisibleHint8 должен быть перемещен код> setUserVisibleHint9 .

 

Only this worked for me!! and setUserVisibleHint(...) is now deprecated (I attached docs at end), which means any other answer is deprecated ;-)

public class FragmentFirewall extends Fragment {     /**      * Required cause "setMenuVisibility(...)" is not guaranteed to be      * called after "onResume()" and/or "onCreateView(...)" method.      */     protected void didVisibilityChange() {         Activity activity = getActivity();         if (isResumed() && isMenuVisible()) {             // Once resumed and menu is visible, at last             // our Fragment is really visible to user.         }     }      @Override     public void onResume() {         super.onResume();         didVisibilityChange();     }      @Override     public void setMenuVisibility(boolean visible) {         super.setMenuVisibility(visible);         didVisibilityChange();     } } 

Tested and works with NaviagationDrawer as well, there isMenuVisible() will always return true (and onResume() seems enough, but we want to support ViewPager too).

setUserVisibleHint is deprecated. If overriding this method, behavior implemented when passing in true should be moved to Fragment.onResume(), and behavior implemented when passing in false should be moved to Fragment.onPause().

</div
 
 
 
 
4
 
vote

Я понял, что <код> public class BaseFragmentHelpLoadDataWhenVisible extends Fragment { protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that /** * This method will be called when viewpager creates fragment and when we go to this fragment background or another activity or fragment * NOT called when we switch between each page in ViewPager */ @Override public void onStart() { super.onStart(); if (mIsVisibleToUser) { onVisible(); } } @Override public void onStop() { super.onStop(); if (mIsVisibleToUser) { onInVisible(); } } /** * This method will called at first time viewpager created and when we switch between each page * NOT called when we go to background or another activity (fragment) when we go back */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); mIsVisibleToUser = isVisibleToUser; if (isResumed()) { // fragment have created if (mIsVisibleToUser) { onVisible(); } else { onInVisible(); } } } public void onVisible() { Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show(); } public void onInVisible() { Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show(); } } 0 и <код> public class BaseFragmentHelpLoadDataWhenVisible extends Fragment { protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that /** * This method will be called when viewpager creates fragment and when we go to this fragment background or another activity or fragment * NOT called when we switch between each page in ViewPager */ @Override public void onStart() { super.onStart(); if (mIsVisibleToUser) { onVisible(); } } @Override public void onStop() { super.onStop(); if (mIsVisibleToUser) { onInVisible(); } } /** * This method will called at first time viewpager created and when we switch between each page * NOT called when we go to background or another activity (fragment) when we go back */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); mIsVisibleToUser = isVisibleToUser; if (isResumed()) { // fragment have created if (mIsVisibleToUser) { onVisible(); } else { onInVisible(); } } } public void onVisible() { Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show(); } public void onInVisible() { Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show(); } } 1 методы вызывали только в случае фрагмента действительно видимого. Я не смог найти какой-либо метод, который ведет себя так, как это, и я попробовал <код> public class BaseFragmentHelpLoadDataWhenVisible extends Fragment { protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that /** * This method will be called when viewpager creates fragment and when we go to this fragment background or another activity or fragment * NOT called when we switch between each page in ViewPager */ @Override public void onStart() { super.onStart(); if (mIsVisibleToUser) { onVisible(); } } @Override public void onStop() { super.onStop(); if (mIsVisibleToUser) { onInVisible(); } } /** * This method will called at first time viewpager created and when we switch between each page * NOT called when we go to background or another activity (fragment) when we go back */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); mIsVisibleToUser = isVisibleToUser; if (isResumed()) { // fragment have created if (mIsVisibleToUser) { onVisible(); } else { onInVisible(); } } } public void onVisible() { Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show(); } public void onInVisible() { Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show(); } } 2 , но он не работал для ситуаций, например, мне нужна переменная, инициализированная в public class BaseFragmentHelpLoadDataWhenVisible extends Fragment { protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that /** * This method will be called when viewpager creates fragment and when we go to this fragment background or another activity or fragment * NOT called when we switch between each page in ViewPager */ @Override public void onStart() { super.onStart(); if (mIsVisibleToUser) { onVisible(); } } @Override public void onStop() { super.onStop(); if (mIsVisibleToUser) { onInVisible(); } } /** * This method will called at first time viewpager created and when we switch between each page * NOT called when we go to background or another activity (fragment) when we go back */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); mIsVisibleToUser = isVisibleToUser; if (isResumed()) { // fragment have created if (mIsVisibleToUser) { onVisible(); } else { onInVisible(); } } } public void onVisible() { Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show(); } public void onInVisible() { Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show(); } } 3 метода.

Так что эти два метода могут быть использованы для этой проблемы как обходной путь, специально для небольших и коротких рабочих мест.

Я думаю, это лучшее решение, но не самое лучшее. Я буду использовать это, но ждать лучшего решения одновременно.

С уважением.

 

I figured out that onCreateOptionsMenu and onPrepareOptionsMenu methods called only in the case of the fragment really visible. I could not found any method which behaves like these, also I tried OnPageChangeListener but it did not work for the situations, for example, I need a variable initialized in onCreate method.

So these two methods can be used for this problem as a workaround, specifically for little and short jobs.

I think, this is the better solution but not the best. I will use this but wait for better solution at the same time.

Regards.

</div
 
 
3
 
vote

SetuservisibleHint (Boolean видимый) теперь устарел , так что это правильное решение

 <код> FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)   

в и viewpager из версии <код> androidx.fragment:fragment:1.1.0 Вы можете просто использовать <код> onPause() и <код> onResume() код> Чтобы определить, какой фрагмент в настоящее время виден для пользователя. <Код> onResume() вызывается, когда фрагмент стал видимым и <код> onPause , когда он останавливается видимым.

Чтобы включить это поведение в первом ViewPager, который вы должны пройти <код> FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT параметра в качестве второго аргумента FragmentPagerAdapter Constructor.

 

setUserVisibleHint(boolean visible) is now deprecated So this is the correct solution

FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) 

In ViewPager2 and ViewPager from version androidx.fragment:fragment:1.1.0 you can just use onPause() and onResume() to determine which fragment is currently visible for the user. onResume() is called when the fragment became visible and onPause when it stops to be visible.

To enable this behavior in the first ViewPager you have to pass FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT parameter as the second argument of the FragmentPagerAdapter constructor.

</div
 
 
2
 
vote

Другое решение Опубликовано здесь Pageradapter Cris Larson почти работал для меня. Но этот метод называется несколько раз для каждой настройки. Также я получил NPE из видов и т. Д. В фрагменте, так как это не готово Первые несколько раз этот метод называется. Со следующими изменениями это работало для меня:

 <код> private int mCurrentPosition = -1;  @Override public void setPrimaryItem(ViewGroup container, int position, Object object) {     super.setPrimaryItem(container, position, object);      if (position == mCurrentPosition) {         return;     }      if (object instanceof MyWhizBangFragment) {         MyWhizBangFragment fragment = (MyWhizBangFragment) object;          if (fragment.isResumed()) {             mCurrentPosition = position;             fragment.doTheThingYouNeedToDoOnBecomingVisible();         }     } }   
 

Another solution posted here overriding setPrimaryItem in the pageradapter by kris larson almost worked for me. But this method is called multiple times for each setup. Also I got NPE from views, etc. in the fragment as this is not ready the first few times this method is called. With the following changes this worked for me:

private int mCurrentPosition = -1;  @Override public void setPrimaryItem(ViewGroup container, int position, Object object) {     super.setPrimaryItem(container, position, object);      if (position == mCurrentPosition) {         return;     }      if (object instanceof MyWhizBangFragment) {         MyWhizBangFragment fragment = (MyWhizBangFragment) object;          if (fragment.isResumed()) {             mCurrentPosition = position;             fragment.doTheThingYouNeedToDoOnBecomingVisible();         }     } } 
</div
 
 
 
 
2
 
vote

Добавить следующий код внутри фрагмента

 <код> @Override public void setMenuVisibility(final boolean visible)   {     super.setMenuVisibility(visible);     if (visible && isResumed())       {       } }   
 

Add following Code inside fragment

@Override public void setMenuVisibility(final boolean visible)   {     super.setMenuVisibility(visible);     if (visible && isResumed())       {       } } 
</div
 
 
 
 
2
 
vote

Я столкнулся с той же проблемой при работе с <код> androidx.fragment:fragment:1.1.00 и 3 вкладках. Я должен был показать Delaog всякий раз, когда 1-я вкладка была нажала и скрыть его на щелчке других вкладок.

Переопределение <код> androidx.fragment:fragment:1.1.01 один не помог найти текущий видимый фрагмент.

При нажатии с 3-й вкладки ----- & GT; 1-я вкладка. Он срабатывал дважды для 2-го фрагмента и для 1-го фрагмента. Я объединил его с помощью ISRESUMED () методом.

 <код> androidx.fragment:fragment:1.1.02  
 

I encountered the same problem while working with FragmentStatePagerAdapters and 3 tabs. I had to show a Dilaog whenever the 1st tab was clicked and hide it on clicking other tabs.

Overriding setUserVisibleHint() alone didn't help to find the current visible fragment.

When clicking from 3rd tab -----> 1st tab. It triggered twice for 2nd fragment and for 1st fragment. I combined it with isResumed() method.

    @Override public void setUserVisibleHint(boolean isVisibleToUser) {     super.setUserVisibleHint(isVisibleToUser);     isVisible = isVisibleToUser;      // Make sure that fragment is currently visible     if (!isVisible && isResumed()) {         // Call code when Fragment not visible     } else if (isVisible && isResumed()) {        // Call code when Fragment becomes visible.     }  } 
</div
 
 
2
 
vote

У нас есть особый случай с MVP, где фрагмент должен уведомить презентаком, что представление стало видимым, а ведущий вводится кинжалом в <Код> androidx.fragment:fragment:1.1.03 .

<Код> androidx.fragment:fragment:1.1.04 недостаточно, мы обнаружили 3 разных случая, которые необходимо решить (<код> androidx.fragment:fragment:1.1.05 упоминается, чтобы вы знали, когда доступен доступен): < / P >.

  1. Фрагмент только что создан. Система делает следующие вызовы:

     <Код> androidx.fragment:fragment:1.1.06  
  2. Фрагмент уже созданный и домашняя кнопка нажата. При восстановлении приложения на передний план это называется:

     <Код> androidx.fragment:fragment:1.1.07  
  3. Изменение ориентации:

     <код> androidx.fragment:fragment:1.1.08  

Мы хотим только подсказкой видимости, чтобы добраться до прездателя один раз, так что именно так мы это делаем:

 <код> androidx.fragment:fragment:1.1.09  

 

We have a special case with MVP where the fragment needs to notify the presenter that the view has become visible, and the presenter is injected by Dagger in fragment.onAttach().

setUserVisibleHint() is not enough, we've detected 3 different cases that needed to be addressed (onAttach() is mentioned so that you know when the presenter is available):

  1. Fragment has just been created. The system makes the following calls:

    setUserVisibleHint() // before fragment's lifecycle calls, so presenter is null onAttach() ... onResume() 
  2. Fragment already created and home button is pressed. When restoring the app to foreground, this is called:

    onResume() 
  3. Orientation change:

    onAttach() // presenter available onResume() setUserVisibleHint() 

We only want the visibility hint to get to the presenter once, so this is how we do it:

@Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {     View root = inflater.inflate(R.layout.fragment_list, container, false);     setHasOptionsMenu(true);      if (savedInstanceState != null) {         lastOrientation = savedInstanceState.getInt(STATE_LAST_ORIENTATION,               getResources().getConfiguration().orientation);     } else {         lastOrientation = getResources().getConfiguration().orientation;     }      return root; }  @Override public void onResume() {     super.onResume();     presenter.onResume();      int orientation = getResources().getConfiguration().orientation;     if (orientation == lastOrientation) {         if (getUserVisibleHint()) {             presenter.onViewBecomesVisible();         }     }     lastOrientation = orientation; }  @Override public void setUserVisibleHint(boolean isVisibleToUser) {     super.setUserVisibleHint(isVisibleToUser);     if (presenter != null && isResumed() && isVisibleToUser) {         presenter.onViewBecomesVisible();     } }  @Override public void onSaveInstanceState(Bundle outState) {     super.onSaveInstanceState(outState);     outState.putInt(STATE_LAST_ORIENTATION, lastOrientation); } 
</div
 
 
2
 
vote

<Сильные> Обнаружение onPause()0 !

Это работает для меня

 <код> onPause()1  
 

Detecting by focused view!

This works for me

public static boolean isFragmentVisible(Fragment fragment) {     Activity activity = fragment.getActivity();     View focusedView = fragment.getView().findFocus();     return activity != null             && focusedView != null             && focusedView == activity.getWindow().getDecorView().findFocus(); } 
</div
 
 
1
 
vote

Я столкнулся с этой проблемой, когда я пытался получить таймер, когда фрагмент в ViewPager был на экране для пользователей, чтобы увидеть.

Таймер всегда начинается непосредственно перед пользователем фрагмент. Это связано с тем, что <код> onResume() метод в фрагменте вызывается, прежде чем мы сможем увидеть фрагмент.

Мое решение должно было сделать проверку в <код> onResume() метода. Я хотел назвать определенный метод «Foo ()», когда фрагмент 8 был представлением язва тока.

 <код> @Override public void onResume() {     super.onResume();     if(viewPager.getCurrentItem() == 8){         foo();         //Your code here. Executed when fragment is seen by user.     } }   

Надеюсь, это поможет. Я видел эту проблему много всплывающую. Кажется, это самое простое решение, которое я видел. Многие другие не совместимы с более низкими API и т. Д.

 

I encountered this problem when I was trying to get a timer to fire when the fragment in the viewpager was on-screen for the user to see.

The timer always started just before the fragment was seen by the user. This is because the onResume() method in the fragment is called before we can see the fragment.

My solution was to do a check in the onResume() method. I wanted to call a certain method 'foo()' when fragment 8 was the view pagers current fragment.

@Override public void onResume() {     super.onResume();     if(viewPager.getCurrentItem() == 8){         foo();         //Your code here. Executed when fragment is seen by user.     } } 

Hope this helps. I've seen this problem pop up a lot. This seems to be the simplest solution I've seen. A lot of others are not compatible with lower APIs etc.

</div
 
 
1
 
vote

У меня была такая же проблема. <Код> ViewPager выполняет другие события жизненного цикла фрагмента, и я не мог изменить это поведение. Я написал простой пейджер, используя фрагменты и доступные анимации. SimplePager

 

I had the same issue. ViewPager executes other fragment life cycle events and I could not change that behavior. I wrote a simple pager using fragments and available animations. SimplePager

</div
 
 
1
 
vote

Я использовал это, и это сработало!

 <код> mContext.getWindow().getDecorView().isShown() //boolean   
 

I used this and it worked !

mContext.getWindow().getDecorView().isShown() //boolean 
</div
 
 
1
 
vote

Я поддерживаю разделахpagerAdapter с детьми фрагментами, поэтому после многих головной боли я наконец получил рабочую версию на основе решений из этой темы:

 <код> public abstract class BaseFragment extends Fragment {      private boolean visible;     private boolean visibilityHintChanged;      /**      * Called when the visibility of the fragment changed      */     protected void onVisibilityChanged(View view, boolean visible) {      }      private void triggerVisibilityChangedIfNeeded(boolean visible) {         if (this.visible == visible || getActivity() == null || getView() == null) {             return;         }         this.visible = visible;         onVisibilityChanged(getView(), visible);     }      @Override     public void onCreate(@Nullable Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         if (!visibilityHintChanged) {             setUserVisibleHint(false);         }     }      @Override     public void onResume() {         super.onResume();         if (getUserVisibleHint() && !isHidden()) {             triggerVisibilityChangedIfNeeded(true);         }     }      @Override     public void onHiddenChanged(boolean hidden) {         super.onHiddenChanged(hidden);         triggerVisibilityChangedIfNeeded(!hidden);     }      @Override     public void setUserVisibleHint(boolean isVisibleToUser) {         super.setUserVisibleHint(isVisibleToUser);         visibilityHintChanged = true;         if (isVisibleToUser && isResumed() && !isHidden()) {             triggerVisibilityChangedIfNeeded(true);         } else if (!isVisibleToUser) {             triggerVisibilityChangedIfNeeded(false);         }     }      @Override     public void onPause() {         super.onPause();         triggerVisibilityChangedIfNeeded(false);     }      @Override     public void onStop() {         super.onStop();         triggerVisibilityChangedIfNeeded(false);     }      protected boolean isReallyVisible() {         return visible;     } }   
 

I support SectionsPagerAdapter with child fragments so after a lot of headache I finally got working version based on solutions from this topic:

public abstract class BaseFragment extends Fragment {      private boolean visible;     private boolean visibilityHintChanged;      /**      * Called when the visibility of the fragment changed      */     protected void onVisibilityChanged(View view, boolean visible) {      }      private void triggerVisibilityChangedIfNeeded(boolean visible) {         if (this.visible == visible || getActivity() == null || getView() == null) {             return;         }         this.visible = visible;         onVisibilityChanged(getView(), visible);     }      @Override     public void onCreate(@Nullable Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         if (!visibilityHintChanged) {             setUserVisibleHint(false);         }     }      @Override     public void onResume() {         super.onResume();         if (getUserVisibleHint() && !isHidden()) {             triggerVisibilityChangedIfNeeded(true);         }     }      @Override     public void onHiddenChanged(boolean hidden) {         super.onHiddenChanged(hidden);         triggerVisibilityChangedIfNeeded(!hidden);     }      @Override     public void setUserVisibleHint(boolean isVisibleToUser) {         super.setUserVisibleHint(isVisibleToUser);         visibilityHintChanged = true;         if (isVisibleToUser && isResumed() && !isHidden()) {             triggerVisibilityChangedIfNeeded(true);         } else if (!isVisibleToUser) {             triggerVisibilityChangedIfNeeded(false);         }     }      @Override     public void onPause() {         super.onPause();         triggerVisibilityChangedIfNeeded(false);     }      @Override     public void onStop() {         super.onStop();         triggerVisibilityChangedIfNeeded(false);     }      protected boolean isReallyVisible() {         return visible;     } } 
</div
 
 
   
   
0
 
vote

Обратите внимание, что <Код> setUserVisibleHint(false) не вызывается оперативной остановкой / фрагментом. Вам все еще нужно будет проверить начало / остановку, чтобы правильно <код> register/unregister любых слушателей / и т. Д.

Также вы получите <код> setUserVisibleHint(false) , если ваш фрагмент начинается в не видимом состоянии; Вы не хотите <код> unregister там, поскольку вы никогда не зарегистрировались в этом случае.

 <код> onResume()0  
 

Note that setUserVisibleHint(false) is not called on activity / fragment stop. You'll still need to check start/stop to properly register/unregister any listeners/etc.

Also, you'll get setUserVisibleHint(false) if your fragment starts in a non-visible state; you don't want to unregister there since you've never registered before in that case.

@Override public void onStart() {     super.onStart();      if (getUserVisibleHint()) {         // register     } }  @Override public void onStop() {     if (getUserVisibleHint()) {         // unregister     }      super.onStop(); }  @Override public void setUserVisibleHint(boolean isVisibleToUser) {     super.setUserVisibleHint(isVisibleToUser);      if (isVisibleToUser && isResumed()) {         // register          if (!mHasBeenVisible) {             mHasBeenVisible = true;         }     } else if (mHasBeenVisible){         // unregister     } } 
</div
 
 
0
 
vote

Простой способ внедрения, который проверяет, вошел ли пользователь в перед переходом на фрагмент.

В вашей решеточной активности вы можете сделать что-то вроде этого внутри onnavightitureced метода.

 <код> onResume()1  

Однако, если вы используете навигационный ящик, выбор в ящике будет изменен в профиль, хотя мы не пошли на профиль.

Для сброса выбора на текущий выбор Запустите код ниже

 <код> onResume()2  
 

A simple way of implementing that is checking whether user is logged in before going to the fragment.

In your MainActivity you may do something like this inside the onNavigationItemSelected method.

 case R.id.nav_profile_side:                   if (User_is_logged_in) {                      fragmentManager.beginTransaction()                             .replace(R.id.content_frame                                     , new FragmentProfile())                             .commit();                 }else {                      ShowLoginOrRegisterDialog(fragmentManager);                  }                  break; 

However, if you are using navigation drawer, the selection in the drawer will have changed to Profile though we have not gone to the ProfileFragment.

To reset the selection to the current selection run the code below

        navigationView.getMenu().getItem(0).setChecked(true); 
</div
 
 
0
 
vote

может быть очень поздно. Это работает для меня. Я немного обновил код от решения @gobar и @kris. Мы должны обновить код в нашем <код> onResume()3 .

<Код> onResume()4 называется каждый раз, когда вкладка отображается и возвращает его положение. Если позиция одинаковы означает, что мы не включенные. Если измененная позиция и текущая позиция не наша нажата вкладка, установленная как -1.

 <код> onResume()5  
 

May be very late. This is working for me. I slightly updated the code from @Gobar and @kris Solutions. We have to update the code in our PagerAdapter.

setPrimaryItem is called every time when a tab is visible and returns its position. If the position are same means we are unmoved. If position changed and current position is not our clicked tab set as -1.

private int mCurrentPosition = -1;  @Override public void setPrimaryItem(@NotNull ViewGroup container, int position, @NotNull Object object) {     // This is what calls setMenuVisibility() on the fragments     super.setPrimaryItem(container, position, object);     if (position == mCurrentPosition) {         return;     }     if (object instanceof YourFragment) {         YourFragment fragment = (YourFragment) object;         if (fragment.isResumed()) {             mCurrentPosition = position;             fragment.doYourWork();//Update your function         }     } else {         mCurrentPosition = -1;     } } 
</div
 
 
-4
 
vote

Я переполнул метод подсчета связанного фрагментатаетеPagerAdapter и вернуть его общий счет минус количество страниц, чтобы скрыть:

 <код>  public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter  {         private List<Fragment> _fragments;       public int TrimmedPages { get; set; }       public MyAdapter(Android.App.FragmentManager fm) : base(fm) { }       public MyAdapter(Android.App.FragmentManager fm, List<Android.App.Fragment> fragments) : base(fm)      {          _fragments = fragments;           TrimmedPages = 0;      }       public override int Count      {          //get { return _fragments.Count; }          get { return _fragments.Count - TrimmedPages; }      }  }   

Так, если в ViewPager изначально добавляется 3 фрагмента, и только первые 2 следует отображаться, пока некоторое условие не будет выполнено, переопределите количество страниц, установив TrimmedPages до 1, и он должен отображать только первые две страницы. < / P >.

Это работает хорошо для страниц в конце, но не очень поможет в начале или средней (хотя есть много способов сделать это).

 

I overrode the Count method of the associated FragmentStatePagerAdapter and have it return the total count minus the number of pages to hide:

 public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter  {         private List<Fragment> _fragments;       public int TrimmedPages { get; set; }       public MyAdapter(Android.App.FragmentManager fm) : base(fm) { }       public MyAdapter(Android.App.FragmentManager fm, List<Android.App.Fragment> fragments) : base(fm)      {          _fragments = fragments;           TrimmedPages = 0;      }       public override int Count      {          //get { return _fragments.Count; }          get { return _fragments.Count - TrimmedPages; }      }  } 

So, if there are 3 fragments initially added to the ViewPager, and only the first 2 should be shown until some condition is met, override the page count by setting TrimmedPages to 1 and it should only show the first two pages.

This works good for pages on the end, but wont really help for ones on the beginning or middle (though there are plenty of ways of doing this).

</div
 
 

Связанный проблема

2  Как получить направление на кратчайший путь внешнего круга в Google Maps Android, когда мое текущее местоположение находится внутри 2 или более кругов?  ( How to get direction to the shortest path outside circle in google maps android ) 
Как получить направление к ближайшему расположению внешний круг, если голубые точки - текущее местоположение? 1 [ 1 и как отображать маркеры только во...

0  Кэшинга не работала на работе при добавлении интернет-соединения перехвата (модернизация 2 - Android)  ( Caching didnt work work when adding internet connection interceptor retrofit 2 ) 
Я пытаюсь реализовать интернет-соединение перехватчика с кэшированием с помощью модернизации и OKHTTP. Кэширование работает нормально, не добавляя интернет-...

0  ONITEMSELUCTERLISTENER не выходит, когда я выбираю то же предыдущее значение  ( Onitemselectedlistener is not fired when i select the same previous value ) 
Когда я снова выбираю то же значение, которое в адаптере значения не обновляются и даже OnitEmseLectedListener или NothingsElected не выдержаны Вот следует ...

1  Пункт меню Текст не отображается в DOWELAPPBAR  ( Menu item text not showing in bottomappbar ) 
Я пытался добавить заголовок пункт меню вместе с значком меню в нижней панели приложений в Android-студии. Я пытался установить: <код> app:showAsAction="ifR...

3  Как установить Gridlines в GridView в Android  ( How to set gridlines to a gridview in android ) 
Я использую GridView, чтобы показать сводный отчет о 3 столбцах в моем приложении. Кажется, все работает нормально, за исключением пропущенных скремок GridVie...

0  Вставить арабский с помощью PDO не работает  ( Insert arabic using pdo is not working ) 
Я очень глубоко укорую в этом и посмотрите много вопросов, и это не работает Каждый раз, когда я пытаюсь вставить арабский, он показывает так (?????) <Сильн...

6  Android Gridlayout API 21  ( Android gridlayout api 21 ) 
Я пытаюсь сделать что-то вроде этого: В настоящее время я вручную устанавливаю ширину плиток, равных половине ширины экрана. Это работает хорошо, но он д...

0  Как использовать матрицу для изменения размера растрового изображения в SurfaceView?  ( How do i use a matrix to resize a bitmap in surfaceview ) 
Я нашел этот бит кода на Подобный вопрос , но я не могу понять, как его использовать. <код> Resizing a Bitmap: public Bitmap getResizedBitmap(Bitmap bm, i...

2  Держите текущую страницу, представленную, пока на следующей странице не загружена  ( Keep current page rendered until the next page is loaded ) 
У меня есть простое приложение, которое основано на WebView.loadurl (« http://www.example.com "). Когда пользователь нажимает на URL, поведение по умолчани...

2  Распознавание речи Android не подключено к службе распознавания  ( Android speech recognizer not connected to the recognition service ) 
Я хочу ввести функцию постоянного распознавания голоса в моем приложении Android. Я осознаю тот факт, что распознавание голоса время от времени зависает от ...

1  Обновить и загрузить один конкретный фрагмент предыдущего действия  ( Refresh and load one particular fragment of the previous activity ) 
У меня есть 3 фрагмента в активности. Один из фрагментов отображает список предметов вместе с ценой и количеством. При выборе любого элемента появится новое д...

2  Изменение Imeoptions клавиатуры xamarin.forms.entry в пользовательском рендере не работает на Android  ( Changing keyboards imeoptions of xamarin forms entry in custom renderer not wor ) 
Что у меня есть: У меня есть пользовательский класс <код> MyEntry , полученный из <код> Xamarin.Forms.Entry и пользовательских классов рендеринга <код> M...

4  Как получить местное видео URI для Exoplayer 2.x  ( How to get local video uri for exoplayer 2 x ) 
У меня есть видеофайл Dog.mp4 в res/raw папка, который я хочу играть с экзоплом. Я пытаюсь выяснить, как получить видео URI для этой строки кода из Руководс...

3  Возможно ли совместное использование экрана в Cordova?  ( Is screen sharing possible in cordova ) 
Я использую Opentok для видеочата и совместного использования экрана. Это отлично работает для меня на браузере. Однако мое приложение также бежит в родом с и...

6  Android Soundpool HeapSize Переполнение  ( Android soundpool heapsize overflow ) 
Я получаю эту ошибку сотни раз, когда я бегу в отладку, это, похоже, не влияет на программу, но как мне избавиться от этого? Я знаю, что его можно проследит...

Связанный проблема

2  Как получить направление на кратчайший путь внешнего круга в Google Maps Android, когда мое текущее местоположение находится внутри 2 или более кругов? 
0  Кэшинга не работала на работе при добавлении интернет-соединения перехвата (модернизация 2 - Android) 
0  ONITEMSELUCTERLISTENER не выходит, когда я выбираю то же предыдущее значение 
1  Пункт меню Текст не отображается в DOWELAPPBAR 
3  Как установить Gridlines в GridView в Android 
0  Вставить арабский с помощью PDO не работает 
6  Android Gridlayout API 21 
0  Как использовать матрицу для изменения размера растрового изображения в SurfaceView? 
2  Держите текущую страницу, представленную, пока на следующей странице не загружена 
2  Распознавание речи Android не подключено к службе распознавания 
1  Обновить и загрузить один конкретный фрагмент предыдущего действия 
2  Изменение Imeoptions клавиатуры xamarin.forms.entry в пользовательском рендере не работает на Android 
4  Как получить местное видео URI для Exoplayer 2.x 
3  Возможно ли совместное использование экрана в Cordova? 
6  Android Soundpool HeapSize Переполнение 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.