Android 替换时销毁碎片

Android 替换时销毁碎片,android,android-fragments,Android,Android Fragments,我有一个片段(Fragment_address),它显示在我的主要活动中的片段容器中。My fragment\u address fragment显示配对设备的列表。单击列出的项目时,该片段在我的主活动中被另一个片段替换。 此片段具有用于显示其他片段的按钮。 这一切都很好,直到我点击一个按钮打开一个新片段,片段的地址和我的新片段都显示在背景中。 由于地址片段只需要一次,有没有办法确保在替换时销毁该片段 我的主要活动 import android.app.FragmentTransaction;

我有一个片段(Fragment_address),它显示在我的主要活动中的片段容器中。My fragment\u address fragment显示配对设备的列表。单击列出的项目时,该片段在我的主活动中被另一个片段替换。 此片段具有用于显示其他片段的按钮。 这一切都很好,直到我点击一个按钮打开一个新片段,片段的地址和我的新片段都显示在背景中。 由于地址片段只需要一次,有没有办法确保在替换时销毁该片段

我的主要活动

import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity implements AddressFragment.OnAddressListener {
    private static final String TAG = "Main Activity";
    // MAC-address of Bluetooth module (you must edit this line)
    private static String address = "No Device Selected";
    private static String deviceName = "No Device Selected";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onAddressChanged(String itemAddress, String itemName){
        // Set your address
        address = itemAddress;
        deviceName = itemName;
        MainFragment fragMain = new MainFragment();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        fragMain.setVariables(address, deviceName);
        ft.replace(R.id.main_frag, fragMain);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();
    }
}
xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        class="com.ming.pondcontroller.AddressFragment"
        android:id="@+id/main_frag"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
我已将addToBackStack放入并再次删除。我认为如果前一个片段没有添加到后堆栈中,ft.replace会破坏前一个片段


我已将此添加到OnClickListener。它添加MainFragment,但始终为AddressFragment返回“null”

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_frag);
        if(fragment != null) {
            Log.d("In OAC","Fragment Not NULL");
            getSupportFragmentManager().beginTransaction().remove(fragment).commit();
        }else{
            Log.d("In OAC","Fragment NULL");
        }
        MainFragment fragMain = new MainFragment();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        fragMain.setVariables(address, deviceName);
        ft.add(R.id.main_frag, fragMain);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();

如果不手动删除这些片段,它们仍然会附加到活动。您的活动未被销毁,因此这些片段也会被销毁。要删除(销毁)这些碎片,可以调用:

对于XML文件中的片段,需要使用findFragmentById

main活动中调用此功能

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_frag)
这是一个关于OnClick Listener方法的问题

 if(fragment != null)
        getSupportFragmentManager().beginTransaction().remove(fragment).commit();

我见过类似的情况,但无法使其工作。如何在MainActivity启动片段时添加标记,然后在单击侦听器时在MainActivity中找到该标记。我的初始地址片段不是动态添加的。它是从XML.class=“com.ming.pondcontroller.AddressFragment”android:id=“@+id/main\u frag”添加的,根据XML中定义的片段更新了代码,这里使用findFragmentById定义片段@Fatmanning我已经将其添加到OnClickListener中,但对于我要删除的片段,它总是返回“null”。
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_frag);
        if(fragment != null) {
            Log.d("In OAC","Fragment Not NULL");
            getSupportFragmentManager().beginTransaction().remove(fragment).commit();
        }else{
            Log.d("In OAC","Fragment NULL");
        }
        MainFragment fragMain = new MainFragment();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        fragMain.setVariables(address, deviceName);
        ft.add(R.id.main_frag, fragMain);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_frag)
 if(fragment != null)
        getSupportFragmentManager().beginTransaction().remove(fragment).commit();