如何在不违反 DRY 原则的情况下从多个活动开始一个 Activity?
How to start One Activity from Multiple Activities without violating the DRY Principle?
我正在开发一个 Android 应用程序,其中一些 Activity 可能从多个 Activity 开始,我知道如何使用 Intents 在 Activity 之间移动。我只是在为如何在不违反 DRY(不要重复自己)原则的情况下编写代码而苦苦挣扎。
代码如下所示,其中重复了从两个不同活动开始相同 Activity 的代码:
MainActivity.java开始SignInActivity.java
public class MainActivity extends AppCompatActivity {
private Button mSignUpButton;
private Button mSignInButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme_MainActivity);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSignUpButton = findViewById(R.id.sign_up_button);
mSignInButton = findViewById(R.id.sign_in_button);
mSignUpButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSignUp();
}
});
mSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSignIn();
}
});
}
private void startSignUp() {
Intent signUpIntent = new Intent(this, SignUpActivity.class);
startActivity(signUpIntent);
}
private void startSignIn() {
Intent signInIntent = new Intent(this, SignInActivity.class);
startActivity(signInIntent);
}
}
SignUpActivity.java开始SignInActivity.java
public class SignUpActivity extends AppCompatActivity {
private Button mSignInButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
mSignInButton = findViewById(R.id.sign_in_button);
mSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSignIn();
}
});
}
private void startSignIn() {
Intent signInIntent = new Intent(this, SignInActivity.class);
startActivity(signInIntent);
}
}
首先-不要崇拜DRY。这是一个经验法则,好的编程并不是全部。
其次-通常我为此所做的是
class SignInIntent extends Activity {
public static Intent createIntent(Context context, parameters) {
Intent intent = new Intent(context, SignInIntent.class);
//Pass parameters here
return intent;
}
}
class SomeOtherActivity extends Activity {
public void someFunc() {
startActivity(SignInIntent.createIntent(this, params);
}
}
我通常有 return 一个意图,而不是只是启动 activity 以防他们出于某种原因想要等待。通过这种方式,您还可以在 SignInActivity 中保留有关需要哪些参数及其名称的所有知识。
我对 DRY 原则一无所知,但是在阅读此 answer 时,我了解了 DRY 原则背后的想法,在考虑您的问题解决方案时,我得到了创建 util class 的想法具有在您想要的活动之间导航的方法:
public class NavigationUtils{
public static void navigate(Context source, Class<?> destination){
Intent intent = new Intent(source, destination);
source.startActivity(intent);
}
}
希望这个回答对您有所帮助。
一个好的考虑是让 BaseActivity
包含常用函数。
public class BaseActivity extends AppCompatActivity {
public void startActivity(Class<?> mClass, Bundle extras){
Intent intent = new Intent(this, mClass);
intent.putExtras(extras);
startActivity(intent);
}
public void startActivity(Class<?> mClass){
Intent intent = new Intent(this, mClass);
startActivity(intent);
}
}
public class SignUpActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
mSignInButton = findViewById(R.id.sign_in_button);
mSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(SignInActivity.class);
}
});
}
}
我正在开发一个 Android 应用程序,其中一些 Activity 可能从多个 Activity 开始,我知道如何使用 Intents 在 Activity 之间移动。我只是在为如何在不违反 DRY(不要重复自己)原则的情况下编写代码而苦苦挣扎。
代码如下所示,其中重复了从两个不同活动开始相同 Activity 的代码:
MainActivity.java开始SignInActivity.java
public class MainActivity extends AppCompatActivity {
private Button mSignUpButton;
private Button mSignInButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme_MainActivity);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSignUpButton = findViewById(R.id.sign_up_button);
mSignInButton = findViewById(R.id.sign_in_button);
mSignUpButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSignUp();
}
});
mSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSignIn();
}
});
}
private void startSignUp() {
Intent signUpIntent = new Intent(this, SignUpActivity.class);
startActivity(signUpIntent);
}
private void startSignIn() {
Intent signInIntent = new Intent(this, SignInActivity.class);
startActivity(signInIntent);
}
}
SignUpActivity.java开始SignInActivity.java
public class SignUpActivity extends AppCompatActivity {
private Button mSignInButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
mSignInButton = findViewById(R.id.sign_in_button);
mSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSignIn();
}
});
}
private void startSignIn() {
Intent signInIntent = new Intent(this, SignInActivity.class);
startActivity(signInIntent);
}
}
首先-不要崇拜DRY。这是一个经验法则,好的编程并不是全部。
其次-通常我为此所做的是
class SignInIntent extends Activity {
public static Intent createIntent(Context context, parameters) {
Intent intent = new Intent(context, SignInIntent.class);
//Pass parameters here
return intent;
}
}
class SomeOtherActivity extends Activity {
public void someFunc() {
startActivity(SignInIntent.createIntent(this, params);
}
}
我通常有 return 一个意图,而不是只是启动 activity 以防他们出于某种原因想要等待。通过这种方式,您还可以在 SignInActivity 中保留有关需要哪些参数及其名称的所有知识。
我对 DRY 原则一无所知,但是在阅读此 answer 时,我了解了 DRY 原则背后的想法,在考虑您的问题解决方案时,我得到了创建 util class 的想法具有在您想要的活动之间导航的方法:
public class NavigationUtils{
public static void navigate(Context source, Class<?> destination){
Intent intent = new Intent(source, destination);
source.startActivity(intent);
}
}
希望这个回答对您有所帮助。
一个好的考虑是让 BaseActivity
包含常用函数。
public class BaseActivity extends AppCompatActivity {
public void startActivity(Class<?> mClass, Bundle extras){
Intent intent = new Intent(this, mClass);
intent.putExtras(extras);
startActivity(intent);
}
public void startActivity(Class<?> mClass){
Intent intent = new Intent(this, mClass);
startActivity(intent);
}
}
public class SignUpActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
mSignInButton = findViewById(R.id.sign_in_button);
mSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(SignInActivity.class);
}
});
}
}