【问题标题】:Cant get from Activity to Activity无法从活动到活动
【发布时间】:2016-08-15 15:52:13
【问题描述】:

这是我的第一个活动

public class  MainActivity extends SampleActivityBase {

private boolean mLogShown;
public static final String TAG = "MainActivity";
private SharedPreferences pref;

EditText cardnumber;
TextView foodorders;
Button buttonorder, addsub;
private static final int REQUEST_CODE = 10;


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    pref = getPreferences(0);
    setContentView(R.layout.activity_main);
    cardnumber = (EditText) findViewById(R.id.card_account_field);
    cardnumber.setText(AccountStorage.GetAccount(getBaseContext()));
    cardnumber.addTextChangedListener(new AccountUpdater());
    foodorders = (TextView) findViewById(R.id.foodordershow);
    buttonorder = (Button) findViewById(R.id.buttonorder);
    addsub = (Button) findViewById(R.id.buttonregister);

    addsub.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), MainActivity1.class);
            startActivity(intent);
        }
    });

    buttonorder.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            String strcardnumber = cardnumber.getText().toString();
            Intent intent = new Intent(getApplicationContext(), activityresult1.class);
            intent.putExtra("Card Number", strcardnumber);
            startActivityForResult(intent, REQUEST_CODE);
        }
    });


}


private class AccountUpdater implements TextWatcher {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // Not implemented.
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // Not implemented.
    }

    @Override
    public void afterTextChanged(Editable s) {
        String account = s.toString();
        AccountStorage.SetAccount(getBaseContext(), account);
    }
}

这是我的第二个活动

public class MainActivity1 extends AppCompatActivity {

private SharedPreferences pref;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main1);
    pref = getPreferences(0);
    initFragment();
}

private void initFragment(){
    Fragment fragment;
    if(pref.getBoolean(Constants.IS_LOGGED_IN,false)){
        fragment = new ProfileFragment();
    }else {
        fragment = new LoginFragment();
    }
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_frame,fragment);
    ft.commit();
}

个人资料片段

public class ProfileFragment extends Fragment implements View.OnClickListener {

private TextView tv_name,tv_email,tv_message;
private SharedPreferences pref;
private AppCompatButton btn_change_password,btn_logout;
private EditText et_old_password,et_new_password;
private AlertDialog dialog;
private ProgressBar progress;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_profile,container);
    initViews(view);
    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    pref = getActivity().getPreferences(0);
    tv_name.setText("Welcome : "+pref.getString(Constants.NAME,""));
    tv_email.setText(pref.getString(Constants.EMAIL,""));

}

private void initViews(View view){

    tv_name = (TextView)view.findViewById(R.id.tv_name);
    tv_email = (TextView)view.findViewById(R.id.tv_email);
    btn_change_password = (AppCompatButton)view.findViewById(R.id.btn_chg_password);
    btn_logout = (AppCompatButton)view.findViewById(R.id.btn_logout);
    btn_change_password.setOnClickListener(this);
    btn_logout.setOnClickListener(this);

}

private void showDialog(){

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.dialog_change_password, null);
    et_old_password = (EditText)view.findViewById(R.id.et_old_password);
    et_new_password = (EditText)view.findViewById(R.id.et_new_password);
    tv_message = (TextView)view.findViewById(R.id.tv_message);
    progress = (ProgressBar)view.findViewById(R.id.progress);
    builder.setView(view);
    builder.setTitle("Change Password");
    builder.setPositiveButton("Change Password", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    dialog = builder.create();
    dialog.show();
    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String old_password = et_old_password.getText().toString();
                String new_password = et_new_password.getText().toString();
                if(!old_password.isEmpty() && !new_password.isEmpty()){

                    progress.setVisibility(View.VISIBLE);
                    changePasswordProcess(pref.getString(Constants.EMAIL,""),old_password,new_password);

                }else {

                    tv_message.setVisibility(View.VISIBLE);
                    tv_message.setText("Fields are empty");
                }
            }
        });
}

@Override
public void onClick(View v) {
    switch (v.getId()){

        case R.id.btn_chg_password:
            showDialog();
            break;
        case R.id.btn_logout:
            logout();
            break;
    }
}

private void logout() {
    SharedPreferences.Editor editor = pref.edit();
    editor.putBoolean(Constants.IS_LOGGED_IN,false);
    editor.putString(Constants.EMAIL,"");
    editor.putString(Constants.NAME,"");
    editor.putString(Constants.UNIQUE_ID,"");
    editor.apply();
    goToLogin();
}

private void goToLogin(){

    Fragment login = new LoginFragment();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_frame,login);
    ft.commit();
}

private void changePasswordProcess(String email,String old_password,String new_password){

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    com.example.android.cardemulation.RequestInterface requestInterface = retrofit.create(com.example.android.cardemulation.RequestInterface.class);

    User user = new User();
    user.setEmail(email);
    user.setOld_password(old_password);
    user.setNew_password(new_password);
    ServerRequest request = new ServerRequest();
    request.setOperation(Constants.CHANGE_PASSWORD_OPERATION);
    request.setUser(user);
    Call<ServerResponse> response = requestInterface.operation(request);

    response.enqueue(new Callback<ServerResponse>() {
        @Override
        public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {

            ServerResponse resp = response.body();
            if(resp.getResult().equals(Constants.SUCCESS)){
                progress.setVisibility(View.GONE);
                tv_message.setVisibility(View.GONE);
                dialog.dismiss();
                Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

            }else {
                progress.setVisibility(View.GONE);
                tv_message.setVisibility(View.VISIBLE);
                tv_message.setText(resp.getMessage());

            }
        }

        @Override
        public void onFailure(Call<ServerResponse> call, Throwable t) {

            Log.d(Constants.TAG,"failed");
            progress.setVisibility(View.GONE);
            tv_message.setVisibility(View.VISIBLE);
            tv_message.setText(t.getLocalizedMessage());


        }
    });
}

登录片段

公共类 LoginFragment 扩展 Fragment 实现 View.OnClickListener{

private AppCompatButton btn_login;
private EditText et_email,et_password;
private TextView tv_register;
private ProgressBar progress;
private SharedPreferences pref;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_login,container,false);
    initViews(view);
    return view;
}

private void initViews(View view){

    pref = getActivity().getPreferences(0);

    btn_login = (AppCompatButton)view.findViewById(R.id.btn_login);
    tv_register = (TextView)view.findViewById(R.id.tv_register);
    et_email = (EditText)view.findViewById(R.id.et_email);
    et_password = (EditText)view.findViewById(R.id.et_password);

    progress = (ProgressBar)view.findViewById(R.id.progress);

    btn_login.setOnClickListener(this);
    tv_register.setOnClickListener(this);
}

@Override
public void onClick(View v) {

    switch (v.getId()){

        case R.id.tv_register:
            goToRegister();
            break;

        case R.id.btn_login:
            String email = et_email.getText().toString();
            String password = et_password.getText().toString();

            if(!email.isEmpty() && !password.isEmpty()) {

                progress.setVisibility(View.VISIBLE);
                loginProcess(email,password);

            } else {

                Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show();
            }
            break;

    }
}
private void loginProcess(String email,String password){

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    com.example.android.cardemulation.RequestInterface requestInterface = retrofit.create(com.example.android.cardemulation.RequestInterface.class);

    User user = new User();
    user.setEmail(email);
    user.setPassword(password);
    ServerRequest request = new ServerRequest();
    request.setOperation(Constants.LOGIN_OPERATION);
    request.setUser(user);
    Call<ServerResponse> response = requestInterface.operation(request);

    response.enqueue(new Callback<ServerResponse>() {
        @Override
        public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {

            ServerResponse resp = response.body();
            Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

            if(resp.getResult().equals(Constants.SUCCESS)){
                SharedPreferences.Editor editor = pref.edit();
                editor.putBoolean(Constants.IS_LOGGED_IN,true);
                editor.putString(Constants.EMAIL,resp.getUser().getEmail());
                editor.putString(Constants.NAME,resp.getUser().getName());
                editor.putString(Constants.UNIQUE_ID,resp.getUser().getUnique_id());
                editor.apply();
                goToProfile();

            }
            progress.setVisibility(View.INVISIBLE);
        }

        @Override
        public void onFailure(Call<ServerResponse> call, Throwable t) {

            progress.setVisibility(View.INVISIBLE);
            Log.d(Constants.TAG,"failed");
            Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();

        }
    });
}

private void goToRegister(){

    Fragment register = new com.example.android.cardemulation.RegisterFragment();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_frame,register);
    ft.commit();
}

private void goToProfile(){

    Fragment profile = new com.example.android.cardemulation.ProfileFragment();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_frame,profile);
    ft.commit();
}

当我按下按钮注册 addsub 时它崩溃并弹出此消息:

04-22 14:35:04.384 10045-10045/com.example.android E/AndroidRuntime: 致命异常:主进程:com.example.android,PID:10045
java.lang.RuntimeException:无法启动活动 组件信息{com.example.android/com.example.android.cardemulation.MainActivity1}: java.lang.IllegalStateException:指定的孩子已经有一个 父母。您必须首先在孩子的父母上调用 removeView()。 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2484) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2544) 在 android.app.ActivityThread.access$900(ActivityThread.java:150) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1394) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:168) 在 android.app.ActivityThread.main(ActivityThread.java:5845) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 引起:java.lang.IllegalStateException:指定的孩子 已经有了父母。您必须在孩子的父母上调用 removeView() 第一的。 在 android.view.ViewGroup.addViewInner(ViewGroup.java:4315) 在 android.view.ViewGroup.addView(ViewGroup.java:4151) 在 android.view.ViewGroup.addView(ViewGroup.java:4092) 在 android.view.ViewGroup.addView(ViewGroup.java:4065) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:985) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 在 android.app.BackStackRecord.run(BackStackRecord.java:793) 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 在 android.app.FragmentController.execPendingActions(FragmentController.java:325) 在 android.app.Activity.performStart(Activity.java:6263) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2447) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2544) 在 android.app.ActivityThread.access$900(ActivityThread.java:150) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1394) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:168) 在 android.app.ActivityThread.main(ActivityThread.java:5845) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)

【问题讨论】:

  • 对我来说,问题似乎出在 ProfileFragment 或 LoginFragment 中。发布这些的代码,可能还有他们的 xml 代码
  • 请发帖ProfileFragmentLoginFragment

标签: java android


【解决方案1】:

不要在您的Intent 中使用getApplicationContext()。使用“本地”Context

Intent intent = new Intent(MainActivity.this, MainActivity1.class);

//or
Intent intent = new Intent(v.getContext(), MainActivity1.class);

//or, define a global variable in your Activity, outside the onClick:
Context context;
//in onCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    pref = getPreferences(0);
    setContentView(R.layout.activity_main);
    context = this;
    //your other code...

// in onClick:
addsub.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Intent intent = new Intent(context, MainActivity1.class);
        startActivity(intent);
    }
});

编辑:

您的ProfilFragment 中的onCreateView 中似乎缺少一个参数。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_profile,container, false); //<--- Added false!
    initViews(view);
    return view;
}

标准是将视图附加到父级,因此您需要告诉充气器不要附加它。

【讨论】:

  • 在这种情况下,你能解释一下为什么不使用getApplicationContext()可以解决问题
  • 据我记得,Intent 需要packageContext - 而不是applicationContext。 (difference)。
  • 你是对的。如果我们使用activitycontext 而不是applicationcontext 会更好。但是,如果您在Intent 中使用applicationcontext,它仍然可以工作
  • @PhanVănLinh 艾米想让我改变什么对不起我不明白
  • 您是否尝试过其他 2 个选项?他们应该工作。不要一起使用,你只需要使用一个选项!
【解决方案2】:

在您的片段中,您需要更改以下行:

**View mView = inflater.inflate(R.layout.yourfragment, parent, false);**

或者像下面这样:

if (mView == null) {
    mView = inflater.inflate(R.layout.yourfragment, container, false);
} else {
    ((ViewGroup) mView .getParent()).removeView(mView );
}

问题在于片段中的膨胀布局。

【讨论】:

  • 对不起,我不明白我需要在哪里改变这个
  • 你能给我发电子邮件吗,因为我还有其他关于布局 vyshunavi95@yahoo.com 的问题
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
相关资源
最近更新 更多