Android 从片段关闭应用程序会导致返回父活动

Android 从片段关闭应用程序会导致返回父活动,android,fragment,Android,Fragment,我尝试了几种从片段内部结束应用程序的方法,如: system.exit(1) android.os.Process.killProcess(android.os.Process.myPid()); getActivity().finish(); 这都是片段代码;退出代码放在exitDialog.setPositiveButton oncliklistener上,在我的try中,它会返回到父活动,而不是退出 package com.TB.mylistprojct; import android

我尝试了几种从片段内部结束应用程序的方法,如:

system.exit(1)
android.os.Process.killProcess(android.os.Process.myPid());
getActivity().finish();
这都是片段代码;退出代码放在exitDialog.setPositiveButton oncliklistener上,在我的try中,它会返回到父活动,而不是退出

package com.TB.mylistprojct;

import android.os.Bundle;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
public class ActFooter extends Fragment
{
    View            EMyView         =null;

    Button          BtnExit         =null;
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater Inflater,ViewGroup Container,Bundle SavedInstanceState)
{
    View MyView=Inflater.inflate(R.layout.actfooter, Container,false);
    EMyView=MyView;
    InitialUI();
    return MyView;
}

public void InitialUI()
{
    BtnExit=(Button)EMyView.findViewById(R.id.Btn_exit);
    BtnExit.setOnClickListener(BtnExit_OnClick);
}

public OnClickListener BtnExit_OnClick=new OnClickListener()
{

    @Override
    public void onClick(View arg0)
    {
        AlertDialog.Builder exitDialog=new AlertDialog.Builder(getActivity());

        exitDialog.setTitle("Warning");
        exitDialog.setMessage("Exit Program");
        exitDialog.setPositiveButton("YSE", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface arg0, int arg1)
            {
                // Exit Code PUT Here
            }
        });
        exitDialog.setNegativeButton("NO", null);
        exitDialog.show();
    }
};
}
但应用程序将返回到父活动

尝试以下操作:

getActivity().moveTaskToBack(true); 
getActivity().finish();

最后我找到了解决办法

首先,我在片段中添加FLOWING代码

Intent intent = new Intent(getActivity(), ACTMain.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.putExtra("LOGOUT", true);
                startActivity(intent);

                getActivity().finish();
在主活动(onCreate函数)中,我使用if语句检查状态并退出:)


这对我来说非常有效(所有人都参与了带有片段容器的活动):

您必须在此处使用此代码:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    boolean back = false;
    if(keyCode == KeyEvent.KEYCODE_BACK){
        back = true;
        backStack();
    }
    return back;

}

只有在后台堆栈中没有活动时,应用程序才会退出。因此,将
android:noHistory=“true”
添加到清单文件中的所有活动(您不希望将其重新堆叠)。然后,要关闭应用程序,请调用
OnBackPressed()
方法中的
finish()

<activity 
    android:name=".activities.MainActivity" 
    android:noHistory="true" />

最近我的应用程序也出现了同样的问题。 我使用了两个退出按钮,一个在主活动中,另一个在片段中

主要活动:- 首先,我在main activity.xml文件中使用onClick属性创建一个按钮,然后在java中使用:

MainActivity.java内部:

对于片段:- 我使用设置ClickListener: 在HomeFragment.java中:

下面是适用于我的片段代码 内部MainActivity.java

public void clickExit(View v){
finish();
}
button_2=(Button) view.findViewById(R.id.home_exit_btn);
    button_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(), "Closing application...",   Toast.LENGTH_SHORT).show();
                getActivity().finish();
            }
        });
        return view;
    }
内部Fragment.java

public void clickExit(View v){
finish();
}
button_2=(Button) view.findViewById(R.id.home_exit_btn);
    button_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(), "Closing application...",   Toast.LENGTH_SHORT).show();
                getActivity().finish();
            }
        });
        return view;
    }
你可以用

if(keyCode == KeyEvent.KEYCODE_BACK)
{
   getActivity().moveTaskToBack(true);
}
除了:

getActivity().finish()
这也对我起了作用:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

我今天也遇到了同样的问题,我尝试了这个代码,它对我来说很好,我希望每个人都能理解

put this code in fragment
Intent intent = new Intent(fragment_name.this, MainActivity_name.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra("LOGOUT", true);
            startActivity(intent);
            fragment_name.this.finish();
并将此代码放入onCreate函数中

    if (getIntent().getBooleanExtra("LOGOUT", false))
        {
            finish();
            System.exit(0);
        }

多亏了@HamidTB:)

你只需要在你的片段中保存父活动的实例来调用它的函数,就像在这个例子中,函数是关闭应用程序,所以只需要在你的片段类型中

syntax is -> referencesObj = activity cast as "parentClass"

kotlin -> val parentActivity = activity as MainActivity
Java   -> MainAcitivity parentAcitivity = (MainActivity) getActivity();
然后使用类似finish()的函数:


我无法在fragment:|@HamidTB中访问此函数。您必须使用
requireActivity()
而不是
getActivity()
。希望这对你有用。
parentActivity.finish()