我正在开发一个Android应用程序,其中某些活动可能是从多个活动开始的,我知道如何使用Intent在活动之间移动。我只是在不违反DRY(请勿重复)原则的情况下努力编写代码。
下面显示了该代码,其中重复了从两个不同活动中启动同一活动的代码:
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);
}
}
答案 0 :(得分:3)
首先-不要崇拜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);
}
}
我通常让它返回一个意图,而不是只是出于某种原因而等待他们开始活动。这样,您还可以在SignInActivity中保留所有需要的参数及其名称的所有知识。
答案 1 :(得分:2)
我对DRY原理一无所知,但是在阅读此answer时,我得到了DRY原理的支持,而在思考您的问题解决方案时,我得到了创建具有导航方法的util类的想法。您想要的活动之间:
public class NavigationUtils{
public static void navigate(Context source, Class<?> destination){
Intent intent = new Intent(source, destination);
source.startActivity(intent);
}
}
希望这个答案对您有帮助。
答案 2 :(得分:1)
好的考虑因素之一是使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);
}
});
}
}