Android Fragment,视图未删除
Posted
技术标签:
【中文标题】Android Fragment,视图未删除【英文标题】:Android Fragment , view is not removed 【发布时间】:2015-06-29 14:17:57 【问题描述】:我开发了一个应用程序,其中我有一个片段交易,
MainActivity
包含Fragment View
。
MainActivity
在屏幕顶部有三个Button
,当我们将这个Activity
转到另一个Fragment
时,它们保持不变,只有MainActivity
Fragment
当我们点击三个中的一部分时会发生变化。
但是,我的问题是,当我从这个MainActivity
移动到Fragment
时,点击First-Button
没问题,但是当我点击Second-Button
时,结果是用第一个@987654333 覆盖屏幕@给另一个Fragment
。
它在同一个Activity
所以,我不能通过remove(fr).commit();
删除Fragment
因为如果我这样做,那么它变得不可点击可能会被片段删除,因此在点击下一个按钮时不会响应。
总体结果,它同时显示FirstFragment
和NewFragment
屏幕,当我移动到NewFragment
时,我如何删除FirstFragment
屏幕?
在MainActivity
三个按钮有以下代码来改变片段:
主要活动:
public class MasterActivity extends Activity
ImageView imgOne, imgTwo, imgThree;
Fragment fr;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_master);
imgOne = (ImageView) findViewById(R.id.imgOne);
imgTwo = (ImageView) findViewById(R.id.imgTwo);
imgThree = (ImageView) findViewById(R.id.imgThree);
imgOne.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
fr = new FirstFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.addToBackStack(null);
//fragmentTransaction.remove(fr).commit();
//getFragmentManager().beginTransaction().remove(fr).commit();
fragmentTransaction.commit();
);
imgTwo.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// TODO Auto-generated method stub
fr = new SecondFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.addToBackStack(null);
//fragmentTransaction.remove(fr).commit();
// getFragmentManager().beginTransaction().remove(fr).commit();
fragmentTransaction.commit();
);
它的xml文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<LinearLayout
android:layout_
android:layout_
android:background="#000000"
android:gravity="bottom"
android:weightSum="3" >
<ImageView
android:id="@+id/imgOne"
android:layout_
android:layout_
android:layout_gravity="center"
android:layout_weight="1"
android:src="@drawable/img1" />
<ImageView
android:id="@+id/imgTwo"
android:layout_
android:layout_gravity="center"
android:layout_
android:layout_weight="1"
android:src="@drawable/img2"/>
<ImageView
android:id="@+id/imgThree"
android:layout_
android:layout_gravity="center"
android:layout_
android:layout_weight="1"
android:src="@drawable/img3" />
</LinearLayout>
<fragment
android:id="@+id/fragment_place"
android:name="packagename.FirstFragment"
android:layout_
android:layout_
android:layout_weight="0.87"/>
<LinearLayout/>
<LinearLayout/>
第一个片段:
public class FirstFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
View r = inflater.inflate(R.layout.first_fratgment, container, false);
return r;
第二个片段:
public class SecondFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
View r = inflater.inflate(R.layout.second_fratgment, container, false);
return r;
但是,当单击一个按钮 Fragment
到另一个按钮时,它会同时显示第一个和第二个 Fragment
屏幕。
那么如何解决它以及如何在第二次点击时删除第一个视图?
我用过这个
fragmentTransaction.remove(fr).commit();
还有这个
getFragmentManager().beginTransaction().remove(fr).commit();
但它不起作用。
【问题讨论】:
请发布您的 NewFragment 课程 当然,请参阅编辑后的问题 你不能有一个嵌入的片段(一个在 xml 布局中声明的片段标签),你可以使用它进行交易(如替换)。因此,而不是那个片段标签,而是放置一个简单的 FrameLayout 并在活动的 onCreate() 方法中手动添加片段。 @Luksprog :谢谢伙计...你太棒了... :) 这个技巧奏效了... ty ty ..... ya @Luksprog 现在它的工作就像魅力... ty... 【参考方案1】:在布局中声明的片段被 Android 区别对待。替换
<fragment
android:id="@+id/fragment_place"
android:name="packagename.FirstFragment"
android:layout_
android:layout_
android:layout_weight="0.87"/>
使用FrameLayout
或您选择的ViewGroup
的子类,并以编程方式处理所有事务。其余的对我来说都不错
【讨论】:
【参考方案2】:最好使用 viewGroup 或 layout/FrameLayout 而不是片段(在 Activity 中单击按钮时的片段导航)。因为 Fragment 有自己的生命周期,并且 Fragment 拥有自己的视图,或者当您在 Activity 中进行 Fragment 转换时不会被杀死。
虽然如果你仍然想使用fragment,首先加载第一个按钮单击的片段并通过删除先前附加的片段(附加到第一个按钮单击的片段)来处理其他两个按钮的单击事件。
这可以通过以下方式完成:
getSupportFragmentManager().beginTransaction().remove(YOUR_FIRST_FRAGMENT).commit();
然后你可以写一段代码在这个地方添加片段,
getFragmentManager().beginTransaction().replace(YOUR_FIRST_FRAGMENT, new YourSecondButtonFragment()).commit();
,因此这也可以在您单击第三个按钮时完成,只需更改附加到第二个按钮的片段。
希望对你有帮助。
【讨论】:
【参考方案3】:在 XML 中硬编码的片段无法替换。 请改用FramLayout
作为片段容器。
在您的 XML 替换中
<fragment
android:id="@+id/fragment_place"
android:name="packagename.FirstFragment"
android:layout_
android:layout_
android:layout_weight="0.87"/>
<LinearLayout/>
与
<FrameLayout
android:id="@+id/contentFragment"
android:layout_
android:layout_
android:layout_weight="2" />
现在,请遵循以下代码样式来实现您的目标:
首先将 onClickListeners 设置为所有图像视图:
喜欢:imgOne.setOnClickListener(this);
@Override
public void onClick(View v)
Fragment fragment = null;
switch (v.getId())
case R.id.imgOne:
fragment = new Fragment1();
break;
case R.id.imgTwo:
fragment = new Fragment2();
break;
if (fragment != null)
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.contentFragment, fragment).commit();
else
Log.e(LOG_TAG, "Error in fragment transaction.");
希望这会有所帮助。
【讨论】:
【参考方案4】:您可以使用:getSupportFragmentManager().beginTransaction().remove(fragment).commit();
希望这会有所帮助。
【讨论】:
【参考方案5】:进行必要的更改。用这个替换你的活动和 xml。 如果你这样做,它应该运行稳定。
public class MasterActivity extends Activity
ImageView imgOne, imgTwo, imgThree;
Fragment fr;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_master);
imgOne = (ImageView) findViewById(R.id.imgOne);
imgTwo = (ImageView) findViewById(R.id.imgTwo);
imgThree = (ImageView) findViewById(R.id.imgThree);
getFragmentManager().beginTransaction().add(R.id.fragment_place, new FirstFragment()).commit();
imgOne.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
getFragmentManager().beginTransaction().replace(R.id.fragment_place, new FirstFragment()).commit();
);
imgTwo.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
getFragmentManager().beginTransaction().replace(R.id.fragment_place, new SecondFragment()).commit();
);
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<LinearLayout
android:layout_
android:layout_
android:background="#000000"
android:gravity="bottom"
android:weightSum="3" >
<ImageView
android:id="@+id/imgOne"
android:layout_
android:layout_
android:layout_gravity="center"
android:layout_weight="1"
android:src="@drawable/img1" />
<ImageView
android:id="@+id/imgTwo"
android:layout_
android:layout_gravity="center"
android:layout_
android:layout_weight="1"
android:src="@drawable/img2"/>
<ImageView
android:id="@+id/imgThree"
android:layout_
android:layout_gravity="center"
android:layout_
android:layout_weight="1"
android:src="@drawable/img3" />
</LinearLayout>
<FrameLayout
android:id="@+id/fragment_place"
android:layout_
android:layout_
android:layout_weight="0.87"/>
<LinearLayout/>
<LinearLayout/>
【讨论】:
【参考方案6】:当我移动到 NewFragment 时,我如何删除第一个框架屏幕?
你可以通过隐藏旧的(第一)Fragment
source来做到这一点
getSupportFragmentManager().beginTransaction().hide(getSupportFragmentManager()
.findFragmentById(R.id.the_id_of_my_first_fragment));
你也可以用同样的方法把他(第一个片段)找回来source
getSupportFragmentManager().beginTransaction().show(getSupportFragmentManager()
.findFragmentById(R.id.the_id_of_my_first_fragment));
这种方法获得了灵活性,并且不会重新更改应用的架构、逻辑以及一条工作线
我总是迟到一个聚会(:
【讨论】:
【参考方案7】:在您的按钮点击事件中复制和破坏代码。
fr = new FirstFragment();
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
这是完成的工作。
【讨论】:
以上是关于Android Fragment,视图未删除的主要内容,如果未能解决你的问题,请参考以下文章