我正在开发包含2个片段的应用程序,我想根据需要显示隐藏。以下代码有我的问题的简单示例。 这个简单的Fragmentactivity包含1个按钮和一个listfragment。
这个简单的例子完美无瑕。但我对show hide片段不满意。如果删除layout.setVisibility(View.GONE);从代码然后ft.hide(f);不会隐藏片段。实际上我们并没有隐藏我们隐藏容器的片段。
我的问题是,这是一种显示隐藏片段的方法吗?如果没有,那么请用测试的例子解释如何隐藏和显示碎片,因为很多人都面临这个问题。
public class MainActivity extends FragmentActivity implements OnClickListener {
Fragment1 f;
Button b;
LinearLayout layout;
Fragment myf;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b = (Button) findViewById(R.id.button1);
layout = (LinearLayout) findViewById(R.id.ll);
f = new Fragment1();
}
@Override
public void onClick(View v) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
if (f.isHidden()) {
ft.show(f);
layout.setVisibility(View.VISIBLE);
b.setText("Hide");
} else {
ft.hide(f);
b.setText("Show");
layout.setVisibility(View.GONE);
}
ft.commit();
// TODO Auto-generated method stub
}
答案 0 :(得分:139)
不要弄乱容器的可见性标志 - FragmentTransaction.hide / show会在内部为您做这些。
所以正确的方法是:
FragmentManager fm = getFragmentManager();
fm.beginTransaction()
.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
.show(somefrag)
.commit();
如果您使用的是android.support.v4.app.Fragment
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
.show(somefrag)
.commit();
答案 1 :(得分:49)
此外,您可以在片段中进行操作(例如,在获取服务器数据失败时):
getView().setVisibility(View.GONE);
答案 2 :(得分:18)
嗨,你使用这种方法做到这一点,所有片段一旦添加就会保留在容器中,然后我们只是揭示所需的片段并将其他片段隐藏在容器中。
// Within an activity
private FragmentA fragmentA;
private FragmentB fragmentB;
private FragmentC fragmentC;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
fragmentA = FragmentA.newInstance("foo");
fragmentB = FragmentB.newInstance("bar");
fragmentC = FragmentC.newInstance("baz");
}
}
// Replace the switch method
protected void displayFragmentA() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (fragmentA.isAdded()) { // if the fragment is already in container
ft.show(fragmentA);
} else { // fragment needs to be added to frame container
ft.add(R.id.flContainer, fragmentA, "A");
}
// Hide fragment B
if (fragmentB.isAdded()) { ft.hide(fragmentB); }
// Hide fragment C
if (fragmentC.isAdded()) { ft.hide(fragmentC); }
// Commit changes
ft.commit();
}
有关详细信息,请参阅https://github.com/codepath/android_guides/wiki/Creating-and-Using-Fragments。我希望我能帮助任何人。即使这是一个老问题。
答案 3 :(得分:6)
public void showHideFragment(final Fragment fragment){
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in,
android.R.animator.fade_out);
if (fragment.isHidden()) {
ft.show(fragment);
Log.d("hidden","Show");
} else {
ft.hide(fragment);
Log.d("Shown","Hide");
}
ft.commit();
}
答案 4 :(得分:3)
试试这个:
MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.mapview);
mapFragment.getView().setVisibility(View.GONE);
答案 5 :(得分:2)
import client from 'discord-rich-presence';
在onCreate中,在setContentView之后,我隐藏了两个片段并将它们提交给片段管理器,但是我没有隐藏第一个用作家的片段。
final Fragment fragment1 = new fragment1();
final Fragment fragment2 = new fragment2();
final FragmentManager fm = getSupportFragmentManager();
Fragment active = fragment1;
Ref:https://medium.com/@oluwabukunmi.aluko/bottom-navigation-view-with-fragments-a074bfd08711
答案 6 :(得分:2)
我可能为时已晚,但将来可能对某人有所帮助。
该答案是对mangu23
answer
的修改
我只添加了一个for循环,以避免重复,并轻松添加了更多没有片段代码的片段。
我们首先需要一个应显示的片段列表
public class MainActivity extends AppCompatActivity{
//...
List<Fragment> fragmentList = new ArrayList<>();
}
然后我们需要用片段填充
@Override
protected void onCreate(Bundle savedInstanceState) {
//...
HomeFragment homeFragment = new HomeFragment();
MessagesFragment messagesFragment = new MessagesFragment();
UserFragment userFragment = new UserFragment();
FavoriteFragment favoriteFragment = new FavoriteFragment();
MapFragment mapFragment = new MapFragment();
fragmentList.add(homeFragment);
fragmentList.add(messagesFragment);
fragmentList.add(userFragment);
fragmentList.add(favoriteFragment);
fragmentList.add(mapFragment);
}
我们需要一种方法来知道从列表中选择了哪个片段,因此我们需要getFragmentIndex
函数
private int getFragmentIndex(Fragment fragment) {
int index = -1;
for (int i = 0; i < fragmentList.size(); i++) {
if (fragment.hashCode() == fragmentList.get(i).hashCode()){
return i;
}
}
return index;
}
最后,displayFragment
方法将如下所示:
private void displayFragment(Fragment fragment) {
int index = getFragmentIndex(fragment);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (fragment.isAdded()) { // if the fragment is already in container
transaction.show(fragment);
} else { // fragment needs to be added to frame container
transaction.add(R.id.placeholder, fragment);
}
// hiding the other fragments
for (int i = 0; i < fragmentList.size(); i++) {
if (fragmentList.get(i).isAdded() && i != index) {
transaction.hide(fragmentList.get(i));
}
}
transaction.commit();
}
这样,我们可以调用displayFragment(homeFragment)
。
这将自动显示HomeFragment
并隐藏列表中的其他任何片段。
此解决方案使您可以将更多片段附加到fragmentList
,而不必在旧的if
版本中重复displayFragment
语句。
我希望有人会觉得有用。
答案 7 :(得分:0)
这对我有用
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if(tag.equalsIgnoreCase("dashboard")){
DashboardFragment dashboardFragment = (DashboardFragment)
fragmentManager.findFragmentByTag("dashboard");
if(dashboardFragment!=null) ft.show(dashboardFragment);
ShowcaseFragment showcaseFragment = (ShowcaseFragment)
fragmentManager.findFragmentByTag("showcase");
if(showcaseFragment!=null) ft.hide(showcaseFragment);
} else if(tag.equalsIgnoreCase("showcase")){
DashboardFragment dashboardFragment = (DashboardFragment)
fragmentManager.findFragmentByTag("dashboard");
if(dashboardFragment!=null) ft.hide(dashboardFragment);
ShowcaseFragment showcaseFragment = (ShowcaseFragment)
fragmentManager.findFragmentByTag("showcase");
if(showcaseFragment!=null) ft.show(showcaseFragment);
}
ft.commit();
答案 8 :(得分:0)
这里的答案是正确的,我喜欢@Jyo,这是显示和隐藏片段实现的Whiff想法,除了他目前拥有的方式会在第一次运行时隐藏片段,因此我添加了一点点改动,即我添加了iFyre。检查并显示片段(如果尚未显示)
type Hoge = { hoge: number };
type Hoge2 = Hoge & { name: string };
type HogeArray = Hoge[];
const hoge: HogeArray = [];
const hoge2: Hoge2 = { hoge: 1, name: "foo" };
hoge.push(hoge2);
hoge.push({ hoge: 3, name: "bar" });
答案 9 :(得分:0)
根据我的代码,与上述解决方案相比,最简单的方法是定义一个包含片段的布局,然后可以通过控制与常规视图一致的layout属性来隐藏或取消隐藏片段。在这种情况下,不需要其他代码,并且可以将片段的其他部署属性移到外部布局。
<LinearLayout style="@style/StHorizontalLinearView"
>
<fragment
android:layout_width="match_parent"
android:layout_height="390dp"
android:layout_alignParentTop="true"
/>
</LinearLayout>