Java android:如何在MainActivity中显示ProgressDialogFragment

Java android:如何在MainActivity中显示ProgressDialogFragment,java,android,android-studio,android-dialogfragment,Java,Android,Android Studio,Android Dialogfragment,我在下面的代码中遇到了一些问题,当我构建应用程序时,它在主活动端显示错误。代码如下: ProgressDialogFragment.java public class ProgressDialogFragment extends DialogFragment { public static ProgressDialogFragment newInstance() { ProgressDialogFragment frag = new ProgressDialogFrag

我在下面的代码中遇到了一些问题,当我构建应用程序时,它在主活动端显示错误。代码如下: 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;
    }

}
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
                }
    }
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
我怎样才能解决这个问题? 谢谢

@编辑 我修复了第一个错误,只是忘了在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)

如果要在内部类中调用外部类方法,应将MainActivity.getFragmentManager()更改为MainActivity。此.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;
    }

}
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
                }
    }
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();
        }
    }
我由@Gennadii Saprykin和handrenliang修复,代码如下:

progressDialog.show(MainActivity.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,但您的活动不是v4,您可以在ProgressDialogFragment中导入非v4 DialogFragment

import android.support.v4.app.DialogFragment;

最后一个崩溃错误是,我只是将对话框声明从MainActivity类移动到HttpAsyncTask类内部

ProgressDialogFragment progressDialog = new ProgressDialogFragment();
谢谢@Gennadii Saprykin和@handrenliang
谢谢你的帮助。

嗨,谢谢你的回复和回答。但是我以前试过,同样错误
error:(216,27)错误:找不到适合show(android.app.FragmentManager,String)的方法DialogFragment.show(android.support.v4.app.FragmentManager,String)不适用(参数不匹配;android.app.FragmentManager无法转换为android.support.v4.app.FragmentManager)方法DialogFragment.show(FragmentTransaction,String)不适用(参数不匹配;android.app.FragmentManager无法转换为FragmentTransaction)
Oh,您使用的是android-v4 DialogFragment,但您的活动不是v4,您可以在ProgressDialogFragment中导入非v4 DialogFragment。Oh。。。谢谢,但在我改为no v4后,构建时不会出现更多错误,但当达到该加载时,它会使应用程序崩溃,并在下面显示错误:
08-04 10:18:21.436 20680-20680/aicrystalstudio.mysoso E/AndroidRuntime﹕ 致命异常:主进程:aicrystalstudio.mysoso,PID:20680 java.lang.NullPointerException位于aicrystalstudio.mysoso.MainActivity$HttpAsyncTask.onPreExecute(MainActivity.java:205)位于android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
此行
progressDialog.show(MainActivity.getFragmentManager(),“loading”);
如果我的答案解决了您的问题,请将其作为答案检查。