DialogFragment 不会在 AsyncTask 中关闭
DialogFragment does not close in AsyncTask
我有办法每 15 秒检查一次 Internet 连接。如果没有互联网连接,该方法将调用 dialogfragment。到目前为止它完美无缺。建立互联网连接后,我无法关闭 dialogFragment。 Logcat不报错。 "dialogfragment dissmis" 不工作,dialogfragment 保留在屏幕上。
首先,我断开与互联网的连接并调用 dialogFragment。后来的互联网连接是 运行 和 "Device is connected to internet." 我看到了文字。但是dialogfragment并没有消失。
CheckInternetAsyncTask.class
public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {
Activity activity;
private Context context;
public CheckInternetAsyncTask(Activity activity) {
this.context = activity.getApplicationContext();
this.activity = activity;
}
@Override
protected Boolean doInBackground(Void... params) {
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
assert cm != null;
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
if (isConnected) {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
//You can replace it with your name
return !ipAddr.equals("");
} catch (Exception e) {
Log.e("TAG", "Error checking internet connection"+ e.getMessage());
return false;
}
} else {
//Log.d("TAG", "No network available!");
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
//Log.d("TAG", "result" + result);
if(result){
// do ur code
Toast.makeText(context,"Device is connected to internet.", Toast.LENGTH_LONG).show();
EthernetControlFragment ethernetControlFragment = EthernetControlFragment.newInstance();
if (ethernetControlFragment != null
&& ethernetControlFragment.getDialog() != null
&& ethernetControlFragment.getDialog().isShowing()
&& !ethernetControlFragment.isRemoving()) {
//dialog is showing so do something
ethernetControlFragment.dismissAllowingStateLoss();
} else {
//dialog is not showing
}
}
else {
Toast.makeText(context,"Device is not connected to internet!",Toast.LENGTH_LONG).show();
EthernetControlFragment ethernetControlFragment = EthernetControlFragment.newInstance();
if (ethernetControlFragment != null
&& ethernetControlFragment.getDialog() != null
&& ethernetControlFragment.getDialog().isShowing()
&& !ethernetControlFragment.isRemoving()) {
//dialog is showing so do something
} else {
//dialog is not showing
ethernetControlFragment.show(((FragmentActivity) activity).getSupportFragmentManager(), "ethernet");
ethernetControlFragment.setCancelable(false);
}
}
}
}
EthernetControlFragment
public class EthernetControlFragment extends DialogFragment {
Context context;
public static EthernetControlFragment newInstance(){
return new EthernetControlFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.dogum_haritasi_dialog);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.ethernet_controls,container,false);
return view;
}}
好的,我将在这里详细解释。
15 秒前您使用以下行创建了一个对话框,我们称它为 object1
EthernetControlFragment.newInstance()
然后 15 秒后,您将再次使用上面的行创建一个新对话框 object2
,当您关闭它时,您将关闭这个新对话框 object2
。不幸的是,您没有保留对旧 Dialog dialog1
的引用,这是真正的问题。
解决方案是只创建一个对象,因此创建 EthernetControlFragment
class 的全局引用并仅在它为 null 时初始化它。这样您将只有一个对话框。
我解决了我的问题。像这样调用片段:
Fragment prev = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentByTag("ethernet");
if (prev == null) {
ethernetControlFragment.show(((FragmentActivity) activity).getSupportFragmentManager(), "ethernet");
ethernetControlFragment.setCancelable(false);
}
然后像这样解散:
Fragment prev = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentByTag("ethernet");
if (prev != null) {
EthernetControlFragment df = (EthernetControlFragment) prev;
df.dismiss();
}
我认为这些方法是调用和关闭 fragment 的最可靠方法。
我有办法每 15 秒检查一次 Internet 连接。如果没有互联网连接,该方法将调用 dialogfragment。到目前为止它完美无缺。建立互联网连接后,我无法关闭 dialogFragment。 Logcat不报错。 "dialogfragment dissmis" 不工作,dialogfragment 保留在屏幕上。
首先,我断开与互联网的连接并调用 dialogFragment。后来的互联网连接是 运行 和 "Device is connected to internet." 我看到了文字。但是dialogfragment并没有消失。
CheckInternetAsyncTask.class
public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {
Activity activity;
private Context context;
public CheckInternetAsyncTask(Activity activity) {
this.context = activity.getApplicationContext();
this.activity = activity;
}
@Override
protected Boolean doInBackground(Void... params) {
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
assert cm != null;
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
if (isConnected) {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
//You can replace it with your name
return !ipAddr.equals("");
} catch (Exception e) {
Log.e("TAG", "Error checking internet connection"+ e.getMessage());
return false;
}
} else {
//Log.d("TAG", "No network available!");
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
//Log.d("TAG", "result" + result);
if(result){
// do ur code
Toast.makeText(context,"Device is connected to internet.", Toast.LENGTH_LONG).show();
EthernetControlFragment ethernetControlFragment = EthernetControlFragment.newInstance();
if (ethernetControlFragment != null
&& ethernetControlFragment.getDialog() != null
&& ethernetControlFragment.getDialog().isShowing()
&& !ethernetControlFragment.isRemoving()) {
//dialog is showing so do something
ethernetControlFragment.dismissAllowingStateLoss();
} else {
//dialog is not showing
}
}
else {
Toast.makeText(context,"Device is not connected to internet!",Toast.LENGTH_LONG).show();
EthernetControlFragment ethernetControlFragment = EthernetControlFragment.newInstance();
if (ethernetControlFragment != null
&& ethernetControlFragment.getDialog() != null
&& ethernetControlFragment.getDialog().isShowing()
&& !ethernetControlFragment.isRemoving()) {
//dialog is showing so do something
} else {
//dialog is not showing
ethernetControlFragment.show(((FragmentActivity) activity).getSupportFragmentManager(), "ethernet");
ethernetControlFragment.setCancelable(false);
}
}
}
}
EthernetControlFragment
public class EthernetControlFragment extends DialogFragment {
Context context;
public static EthernetControlFragment newInstance(){
return new EthernetControlFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.dogum_haritasi_dialog);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.ethernet_controls,container,false);
return view;
}}
好的,我将在这里详细解释。
15 秒前您使用以下行创建了一个对话框,我们称它为 object1
EthernetControlFragment.newInstance()
然后 15 秒后,您将再次使用上面的行创建一个新对话框 object2
,当您关闭它时,您将关闭这个新对话框 object2
。不幸的是,您没有保留对旧 Dialog dialog1
的引用,这是真正的问题。
解决方案是只创建一个对象,因此创建 EthernetControlFragment
class 的全局引用并仅在它为 null 时初始化它。这样您将只有一个对话框。
我解决了我的问题。像这样调用片段:
Fragment prev = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentByTag("ethernet");
if (prev == null) {
ethernetControlFragment.show(((FragmentActivity) activity).getSupportFragmentManager(), "ethernet");
ethernetControlFragment.setCancelable(false);
}
然后像这样解散:
Fragment prev = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentByTag("ethernet");
if (prev != null) {
EthernetControlFragment df = (EthernetControlFragment) prev;
df.dismiss();
}
我认为这些方法是调用和关闭 fragment 的最可靠方法。