Когда показывать выпадающее окно во фрагменте? - PullRequest
0 голосов
/ 07 сентября 2018

Я получаю следующую ошибку при попытке autocompleteTextView.showDropDown():

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

Я пытался сделать это различными Fragment методами жизненного цикла. Эта ошибка всегда выскакивает.

Где я могу вызвать методы, которые отображают дополнительные окна во фрагменте?

EDIT:

@BindView(R.id.acService) AutoCompleteTextView autocompleteSTextView;

@Override
public void onAttach(Context context)
{
    super.onAttach(context);
    this.context = context;
}

@Override
public void onDetach()
{
    super.onDetach();
    context = null;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState)
{
    return inflater.inflate(R.layout.fragment_home, container, false);
}

@Override
public void onResume()
{
    initialize();
    loadSkillsData();
    super.onResume();
}

private void initialize()
{
    util = new Util(context);
    requestService = new RequestService();
    requestService.setServerUserId(getUser().getServerUserId());
    geoDataClient = Places.getGeoDataClient(context);

    autocompleteAdapter = new PlaceAutocompleteAdapter(context, geoDataClient, BOUNDS_WORLD, null);
    autocompleteTextView.setAdapter(autocompleteAdapter);

    mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    mapFragment.getMapAsync(this);

    autocompleteTextView.setOnFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean hasFocus)
        {
            if(hasFocus)
            {
                autocompleteService.showDropDown();
            }
        }
    });
}

А вот как фрагмент загружается в Activity. Я использую MaterialNavigationDrawer:

private void replaceWithFragment(Fragment fragment)
{
    getSupportFragmentManager().beginTransaction().replace(R.id.frame, fragment).commit();
    navigationDrawer.closeDrawer();
}

1 Ответ

0 голосов
/ 07 сентября 2018

onFocusChange() можно вызвать до того, как что-либо действительно станет видимым.

Изменение

if(hasFocus)
{
    autocompleteService.showDropDown();
}

до

if(hasFocus && isVisible())
{
    autocompleteService.showDropDown();
}

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

...