如何从 activity 调用片段。当视图不属于相应布局时
How to call a Fragment from activity. When the view doesn't belong to corresponding layout
在我的场景中,我有一个片段,其中有用户可以 select 的选项列表(Recycler 视图)。
示例:我的个人资料、更改密码、注销。
如果用户从 Fragment A 回收器视图适配器 中单击更改密码,则用户将导航到 Activity A.用户可以在哪里更改密码。单击 Activity A 中的提交按钮后,用户应导航至 片段 A.
代码在ActivityA
package com.example.expresso.sapthagiri.yogirproduct;
import android.content.Intent;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class ChangePassword extends AppCompatActivity {
Button submit, back;
EditText old_password, new_password, re_enter_password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_password);
submit = findViewById(R.id.submit);
back = findViewById(R.id.backButton);
old_password = findViewById(R.id.oldPassword);
new_password = findViewById(R.id.newPassword);
re_enter_password = findViewById(R.id.reEnterPassword);
final ProfileFragment profileFragment = new ProfileFragment();
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setFragment(profileFragment);
}
});
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setFragment(profileFragment);
}
});
}
private void setFragment(android.support.v4.app.Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment).commit();
}
}
目前的实际问题:我正在尝试加载片段 A,但 R.id.main_frame 不属于 setContentView(R.layout.activity_change_password);.
private void setFragment(android.support.v4.app.Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment).commit();
}
请帮我解决问题。提前万分感谢! :)
您混淆了 android 的导航架构。当您启动 Activity A 时,它会将 Activity A 添加到 activity 堆栈。因此,带有片段 A 的 Activity 仍在该活动堆栈中。所以你所要做的就是完成 activity A。这基本上会在 activity 堆栈上执行弹出操作。
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed(); //or finish()
}
});
这样就可以了。
在我的场景中,我有一个片段,其中有用户可以 select 的选项列表(Recycler 视图)。 示例:我的个人资料、更改密码、注销。
如果用户从 Fragment A 回收器视图适配器 中单击更改密码,则用户将导航到 Activity A.用户可以在哪里更改密码。单击 Activity A 中的提交按钮后,用户应导航至 片段 A.
代码在ActivityA
package com.example.expresso.sapthagiri.yogirproduct;
import android.content.Intent;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class ChangePassword extends AppCompatActivity {
Button submit, back;
EditText old_password, new_password, re_enter_password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_password);
submit = findViewById(R.id.submit);
back = findViewById(R.id.backButton);
old_password = findViewById(R.id.oldPassword);
new_password = findViewById(R.id.newPassword);
re_enter_password = findViewById(R.id.reEnterPassword);
final ProfileFragment profileFragment = new ProfileFragment();
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setFragment(profileFragment);
}
});
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setFragment(profileFragment);
}
});
}
private void setFragment(android.support.v4.app.Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment).commit();
}
}
目前的实际问题:我正在尝试加载片段 A,但 R.id.main_frame 不属于 setContentView(R.layout.activity_change_password);.
private void setFragment(android.support.v4.app.Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment).commit();
}
请帮我解决问题。提前万分感谢! :)
您混淆了 android 的导航架构。当您启动 Activity A 时,它会将 Activity A 添加到 activity 堆栈。因此,带有片段 A 的 Activity 仍在该活动堆栈中。所以你所要做的就是完成 activity A。这基本上会在 activity 堆栈上执行弹出操作。
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed(); //or finish()
}
});
这样就可以了。