android: 如何在 MainActivity 中显示 ProgressDialogFragment
android: how to show ProgressDialogFragment in MainActivity
我在下面的代码中遇到了一些问题,当我构建应用程序时,它在 MainActivity 端显示错误。下面是代码:
ProgressDialogFragment.java
public class ProgressDialogFragment extends DialogFragment
{
public static ProgressDialogFragment newInstance() {
ProgressDialogFragment frag = new ProgressDialogFragment ();
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setCancelable(false);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
ProgressDialog dialog = new ProgressDialog(getActivity(), getTheme());
dialog.setTitle(getString(R.string.updatename_loading_title));
dialog.setMessage(getString(R.string.updatename_loading_message));
dialog.setIndeterminate(true);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
return dialog;
}
}
MainActivity.java
public void doPositiveClick(DialogFragment dialog) {
Dialog dialogView = dialog.getDialog();
EditText editName = (EditText) dialogView.findViewById(R.id.editName);
String updateName = editName.getText().toString().trim();
login.setName(updateName);
new HttpAsyncTask().execute(uNameUrl);
dialogView.dismiss();
}
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show(MainActivity.getFragmentManager(),"loading");
}
@Override
protected String doInBackground(String... urls) {
// Do Action Here
}
}
我想在提交后显示加载,但在下面一行出现错误:
progressDialog.show(MainActivity.getFragmentManager(),"loading");
构建应用程序后显示以下错误消息。
Error:(216, 45) error: non-static method getFragmentManager() cannot be referenced from a static context
我该如何解决这个问题?
谢谢
@编辑
我修复了第一个错误,我只是忘了在 ProgressDialogFragment.java
上添加这个
@Override
public void show(FragmentManager manager, String tag) {
if (manager.findFragmentByTag(tag) == null) {
super.show(manager, tag);
}
}
用于防止旋转手机时出现重复对话框。
现在出现第二个错误
Error:(40, 5) error: method does not override or implement a method from a supertype
Error:(43, 18) error: no suitable method found for show(android.app.FragmentManager,String)
method DialogFragment.show(android.support.v4.app.FragmentManager,String) is not applicable
(argument mismatch; android.app.FragmentManager cannot be converted to android.support.v4.app.FragmentManager)
method DialogFragment.show(FragmentTransaction,String) is not applicable
(argument mismatch; android.app.FragmentManager cannot be converted to FragmentTransaction)
您在内部 class 中调用了外部 class 方法,您应该将 MainActivity.getFragmentManager() 更改为 MainActivity.this.getFragmentManager()
我解决了这个问题:
ProgressDialogFragment.java
public class ProgressDialogFragment extends DialogFragment
{
public static ProgressDialogFragment newInstance() {
ProgressDialogFragment frag = new ProgressDialogFragment ();
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setCancelable(false);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
ProgressDialog dialog = new ProgressDialog(getActivity(), getTheme());
dialog.setTitle(getString(R.string.updatename_loading_title));
dialog.setMessage(getString(R.string.updatename_loading_message));
dialog.setIndeterminate(true);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
return dialog;
}
}
MainActivity.java
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
ProgressDialogFragment progressDialog = new ProgressDialogFragment();
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show(getFragmentManager(), "loading");
}
@Override
protected String doInBackground(String... urls) {
return UpdateData(MainActivity.this, urls[0], login);
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
progressDialog.dismiss();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
finish();
Log.d("posted", result);
Toast.makeText(getBaseContext(), "Display Name Successful Changed!", Toast.LENGTH_LONG).show();
}
}
关于
的第一个问题
Error:(216, 45) error: non-static method getFragmentManager() cannot be referenced from a static context
我由@Gennadii Saprykin 和 handrenliang 使用以下代码修复:
progressDialog.show(MainActivity.getFragmentManager(),"loading");
到
progressDialog.show(MainActivity.this.getFragmentManager(),"loading");
第二个错误:
Error:(216, 27) error: no suitable method found for show(android.app.FragmentManager,String) method DialogFragment.show(android.support.v4.app.FragmentManager,String) is not applicable (argument mismatch; android.app.FragmentManager cannot be converted to android.support.v4.app.FragmentManager) method DialogFragment.show(FragmentTransaction,String) is not applicable (argument mismatch; android.app.FragmentManager cannot be converted to FragmentTransaction)
由@handrenliang 修复,如下所示:
使用了 android-v4 DialogFragment,但您的 activity 不是 v4,您可以在 ProgressDialogFragment 中导入非 v4 DialogFragment。
import android.support.v4.app.DialogFragment;
到
import android.app.DialogFragment;
最后一个崩溃错误,我只是将对话框声明从 MainActivity Class 移动到 HttpAsyncTask Class.
内部
ProgressDialogFragment progressDialog = new ProgressDialogFragment();
感谢@Gennadii Saprykin 和@handrenliang
寻求帮助。
我在下面的代码中遇到了一些问题,当我构建应用程序时,它在 MainActivity 端显示错误。下面是代码: ProgressDialogFragment.java
public class ProgressDialogFragment extends DialogFragment
{
public static ProgressDialogFragment newInstance() {
ProgressDialogFragment frag = new ProgressDialogFragment ();
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setCancelable(false);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
ProgressDialog dialog = new ProgressDialog(getActivity(), getTheme());
dialog.setTitle(getString(R.string.updatename_loading_title));
dialog.setMessage(getString(R.string.updatename_loading_message));
dialog.setIndeterminate(true);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
return dialog;
}
}
MainActivity.java
public void doPositiveClick(DialogFragment dialog) {
Dialog dialogView = dialog.getDialog();
EditText editName = (EditText) dialogView.findViewById(R.id.editName);
String updateName = editName.getText().toString().trim();
login.setName(updateName);
new HttpAsyncTask().execute(uNameUrl);
dialogView.dismiss();
}
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show(MainActivity.getFragmentManager(),"loading");
}
@Override
protected String doInBackground(String... urls) {
// Do Action Here
}
}
我想在提交后显示加载,但在下面一行出现错误:
progressDialog.show(MainActivity.getFragmentManager(),"loading");
构建应用程序后显示以下错误消息。
Error:(216, 45) error: non-static method getFragmentManager() cannot be referenced from a static context
我该如何解决这个问题? 谢谢
@编辑 我修复了第一个错误,我只是忘了在 ProgressDialogFragment.java
上添加这个@Override
public void show(FragmentManager manager, String tag) {
if (manager.findFragmentByTag(tag) == null) {
super.show(manager, tag);
}
}
用于防止旋转手机时出现重复对话框。 现在出现第二个错误
Error:(40, 5) error: method does not override or implement a method from a supertype
Error:(43, 18) error: no suitable method found for show(android.app.FragmentManager,String)
method DialogFragment.show(android.support.v4.app.FragmentManager,String) is not applicable
(argument mismatch; android.app.FragmentManager cannot be converted to android.support.v4.app.FragmentManager)
method DialogFragment.show(FragmentTransaction,String) is not applicable
(argument mismatch; android.app.FragmentManager cannot be converted to FragmentTransaction)
您在内部 class 中调用了外部 class 方法,您应该将 MainActivity.getFragmentManager() 更改为 MainActivity.this.getFragmentManager()
我解决了这个问题: ProgressDialogFragment.java
public class ProgressDialogFragment extends DialogFragment
{
public static ProgressDialogFragment newInstance() {
ProgressDialogFragment frag = new ProgressDialogFragment ();
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setCancelable(false);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
ProgressDialog dialog = new ProgressDialog(getActivity(), getTheme());
dialog.setTitle(getString(R.string.updatename_loading_title));
dialog.setMessage(getString(R.string.updatename_loading_message));
dialog.setIndeterminate(true);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
return dialog;
}
}
MainActivity.java
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
ProgressDialogFragment progressDialog = new ProgressDialogFragment();
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show(getFragmentManager(), "loading");
}
@Override
protected String doInBackground(String... urls) {
return UpdateData(MainActivity.this, urls[0], login);
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
progressDialog.dismiss();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
finish();
Log.d("posted", result);
Toast.makeText(getBaseContext(), "Display Name Successful Changed!", Toast.LENGTH_LONG).show();
}
}
关于
的第一个问题Error:(216, 45) error: non-static method getFragmentManager() cannot be referenced from a static context
我由@Gennadii Saprykin 和 handrenliang 使用以下代码修复:
progressDialog.show(MainActivity.getFragmentManager(),"loading");
到
progressDialog.show(MainActivity.this.getFragmentManager(),"loading");
第二个错误:
Error:(216, 27) error: no suitable method found for show(android.app.FragmentManager,String) method DialogFragment.show(android.support.v4.app.FragmentManager,String) is not applicable (argument mismatch; android.app.FragmentManager cannot be converted to android.support.v4.app.FragmentManager) method DialogFragment.show(FragmentTransaction,String) is not applicable (argument mismatch; android.app.FragmentManager cannot be converted to FragmentTransaction)
由@handrenliang 修复,如下所示: 使用了 android-v4 DialogFragment,但您的 activity 不是 v4,您可以在 ProgressDialogFragment 中导入非 v4 DialogFragment。
import android.support.v4.app.DialogFragment;
到
import android.app.DialogFragment;
最后一个崩溃错误,我只是将对话框声明从 MainActivity Class 移动到 HttpAsyncTask Class.
内部ProgressDialogFragment progressDialog = new ProgressDialogFragment();
感谢@Gennadii Saprykin 和@handrenliang 寻求帮助。