0

У меня есть внутри Activity один полный экран Fragment. Внутри этого Fragment У меня есть еще Fragment, накладывающийся на нижнюю часть экрана. Таким образом, в верхней части экрана, у меня Button контрольного Visible/скрыть внутреннюю Fragment:Android: Показать и скрыть фрагмент

  1. компоновка содержащего Fragment:

    ... 
    <FrameLayout 
        android:id="@+id/inner_fragment" 
        android:layout_width="match_parent" 
        android:layout_height="200dp" 
        android:layout_below="@+id/top_part" 
        android:name="com.package.InnerFragment" /> 
    
  2. контролирующего Button:

    controlButton.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         if (!isInnerVisible) showHideInnerFragment("show"); 
         else showHideInnerFragment("hide"); 
        } 
    }); 
    
  3. Вспомогательный метод showHideInnerFragment:

    private void showHideInnerFragment(String param) { 
        //variables are class members... 
        fragmentManager = getFragmentManager(); 
        fragmentTransaction = fragmentManager.beginTransaction(); 
        innerFragment = new InnerFragment(); 
        if (param.equals("show")) { 
         fragmentTransaction.add(R.id.inner_fragment, innerFragment); 
         isInnerVisible = true; 
        } else { 
         fragmentTransaction.remove(innerFragment); 
         isInnerVisible = false; 
        } 
        fragmentTransaction.addToBackStack(null); 
        fragmentTransaction.commit(); 
    } 
    

Ну - Это совершенно не работает ...

+0

showHideInnerFragment() или showHideGroupsFragment()? – mjp66

+0

@ mjp66 typo fixed .... – michael

+1

Спасибо! Я отправлю ответ через минуту, но похоже, что вы только вызываете метод с вашим параметром, который всегда передается как «показать» – mjp66

ответ

1

Оказывается, что ваш isInnerVisible всегда ложно (я предполагаю, что это начинается как ложь), который удаляет фрагмент, но сохраняет isInnerVisible ложь , Вы, наверное, просто нужно переключить, что вокруг:

private void showHideInnerFragment(String param) { 
    //variables are class members... 
    fragmentManager = getFragmentManager(); 
    fragmentTransaction = fragmentManager.beginTransaction(); 
    innerFragment = new InnerFragment(); 
    if (param.equals("show")) { 
     fragmentTransaction.add(R.id.inner_fragment, innerFragment); 
     isInnerVisible = false; 
    } else { 
     fragmentTransaction.remove(innerFragment); 
     isInnerVisible = true; 
    } 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
} 

Я хотел бы также передать истинное/ложное значение параметра, а не строковое значение, это делает его гораздо легче понять, что делает код, как это теперь это своего рода не имеет смысла. Я буду обновлять с примером в немного;)

редактировать: вот лучше способ сделать то, что вы хотите:

controlButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     showHideInnerFragment(isInnerVisible); 
    } 
}); 

private void showHideInnerFragment(boolean isVisible) { 
    //variables are class members... 
    fragmentManager = getFragmentManager(); 
    fragmentTransaction = fragmentManager.beginTransaction(); 
    innerFragment = new InnerFragment(); 
    if (isVisible == false) { 
     fragmentTransaction.add(R.id.inner_fragment, innerFragment); 
     isInnerVisible = true; 
    } else { 
     fragmentTransaction.remove(innerFragment); 
     isInnerVisible = false; 
    } 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
} 
+0

Он все еще не работает. Я подозреваю, что использование методов добавления и удаления «FragmentManager» неверно и должно быть другим методом? – michael

+0

Хммм. Я когда-то делал что-то похожее на то, что вы пытаетесь сделать, и не имел проблем. Возможно, я не вижу ничего очевидного. Как насчет отправки xml только для пинков? – mjp66