Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对话框片段使用改型更改密码_Java_Android_Android Fragments_Retrofit2 - Fatal编程技术网

Java 对话框片段使用改型更改密码

Java 对话框片段使用改型更改密码,java,android,android-fragments,retrofit2,Java,Android,Android Fragments,Retrofit2,我想从弹出的对话框中使用改装库更改ProfileActivity.java中的用户密码 该场景是用户单击MainActivity.java中的编辑按钮后将显示的对话框 我已经成功地显示了对话框并将if-else放在上面,但问题是我无法将数据发送到ProfileActivity.java中的改型方法 我不知道如何以及在哪里调用使应用程序崩溃的改造方法 下面是我的代码ProfileActivity.java,底部是reformation方法: public class ProfileActivity

我想从弹出的
对话框中使用
改装
库更改
ProfileActivity.java
中的用户密码
该场景是用户单击
MainActivity.java
中的
编辑按钮后将显示的
对话框

我已经成功地显示了
对话框
并将if-else放在上面,但问题是我无法将数据发送到
ProfileActivity.java
中的
改型
方法

我不知道如何以及在哪里调用使应用程序崩溃的
改造方法

下面是我的代码ProfileActivity.java,底部是
reformation
方法:

public class ProfileActivity extends AppCompatActivity implements ChangePassDialog.ChangePassDialogListener {

    private String oldPassExtra, newPassExtra;

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

    Button btnEditPass = findViewById(R.id.btn_editPass);

        btnEditPass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ChangePass changePassDialog = new ChangePass();
                changePassDialog.show(getSupportFragmentManager(),"Pass Dialog Changer");


      }
        });    
    }

    public void changePassApi(String oldPass, String newPass) {
        RestApi api = RetroFit.getInstanceRetrofit();
        Call<ResponseRegister> registerCall = api.changePassword(
                oldPass,
                newPass
        );
        registerCall.enqueue(new Callback<ResponseRegister>() {
            // If response success
            @Override
            public void onResponse(Call<ResponseRegister> call, Response<ResponseRegister> response) {
                if (response.isSuccessful()) {
                    String result = response.body().getResult();
                    String msg = response.body().getMsg();
                    if (result.equals("1")) {
                        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "Connection Failed!", Toast.LENGTH_LONG).show();
                }
            }

            // if response fail
            @Override
            public void onFailure(Call<ResponseRegister> call, Throwable t) {
                Toast.makeText(getApplicationContext(), "Connection Problem", Toast.LENGTH_LONG).show();
            }
        });
    }
}
Dialog.xml

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

    <EditText
        android:id="@+id/edit_passOld"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:layout_marginBottom="10dp"
        android:hint="Password lama"
        android:inputType="textPassword"
        android:paddingStart="25dp"
        android:paddingLeft="25dp"
        android:paddingEnd="0dp"
        android:paddingRight="0dp" />

    <EditText
        android:id="@+id/edit_passNew"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/edit_passOld"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:hint="Password baru"
        android:inputType="textPassword"
        android:paddingStart="25dp"
        android:paddingLeft="25dp"
        android:paddingEnd="0dp"
        android:paddingRight="0dp" />

    <TextView
        android:id="@+id/ok_pass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/edit_passNew"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="25dp"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginRight="25dp"
        android:text="OK"
        android:textColor="@color/purple"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/cancel_pass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/edit_passNew"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginStart="25dp"
        android:layout_marginLeft="25dp"
        android:layout_marginTop="30dp"
        android:text="CANCEL"
        android:textColor="@color/purple"
        android:textSize="16sp" />
</RelativeLayout>
感谢您的帮助

profileActivity=新的profileActivity()

您不能像这样获取ProfileActivity对象,而且永远不要这样做。它初始化ProfileActivity的全新实例,该实例与您的跑步活动无关

像这样做

profileActivity=(profileActivity)getActivity()

选项2。

我更喜欢这个


将您的
public void changePassApi()
方法放在对话框片段中

首先,您不应该直接创建任何活动的实例

  • 删除
    profileActivity=newprofileActivity()(永远不要这样做)
  • 为片段回调定义接口(可以命名为任何名称)
  • 使主机活动实现回调
  • onAttach()
    中获取活动引用,并将其类型转换为回调,确保在
    onDetach()
    中将其设置为
    null
    ,以防止泄漏(最佳做法)
  • 在需要时调用回调方法
  • 示例片段回调实现。

    主机活动:

    public class MainActivity extends AppCompatActivity implements LoginFragment.Callbacks {
        .
        .
        .
        @Override
        public void changePassword(String newPassword) {
            //do retrofit call
        }
        .
        .
        .
    }
    
    对话框片段:

    public class LoginFragment extends DialogFragment {
    
        private Callbacks mCallbacks;
    
        private Button btnOk;
        .
        .
        .
        private void setViews() {
            btnOk.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mCallbacks.changePassword("1234");
                }
            });
        }
        .
        .
        .
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            mCallbacks = (Callbacks) context;
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            mCallbacks = null;
        }
    
        public interface Callbacks {
            void changePassword(String newPassword);
        }
    }
    
    提示:
    此外,您可以在调用回调方法时处理类型转换异常和回调引用空检查。

    当应用程序崩溃时,您的日志文件/错误消息会说什么?
    导致应用程序崩溃。
    logcat请。@IntelliJAmiya这是logcatWow它工作正常,先生,非常感谢!是的,我还没有掌握java的基本知识,初始化等等,这让我感到困惑。选项1很好,但是现在,我尝试你的选项2,因为我需要澄清现有数据库的旧密码上面的两个选项正在工作,非常感谢!这不是一个好的做法,1。getActivity并不总是ProfileActivity。2.如果活动正在完成:抛出异常,则getActivity()可以返回null。3.如果类实例位于中,则将活动实例存储在其他类的成员中可能会导致ActivityLakmemory@VikasBorkar我为他目前的问题提供了解决办法。然后,正如你所注意到的,我向他展示了更正确的方法2@FaisalIchal欢迎,请考虑Vikas Borkar的评论,并选择选项2,因为第一个答案可能导致内存泄漏?你是说未删除的一堆活动?但如果我的活动只被访问一次怎么办?我的意思是,对话框只在B活动中显示一次,然后在更改密码后,它将被取消,然后返回按钮将B活动带到A活动,而不是其他活动。CMIIW
    public class MainActivity extends AppCompatActivity implements LoginFragment.Callbacks {
        .
        .
        .
        @Override
        public void changePassword(String newPassword) {
            //do retrofit call
        }
        .
        .
        .
    }
    
    public class LoginFragment extends DialogFragment {
    
        private Callbacks mCallbacks;
    
        private Button btnOk;
        .
        .
        .
        private void setViews() {
            btnOk.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mCallbacks.changePassword("1234");
                }
            });
        }
        .
        .
        .
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            mCallbacks = (Callbacks) context;
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            mCallbacks = null;
        }
    
        public interface Callbacks {
            void changePassword(String newPassword);
        }
    }