如何在不违反DRY原则的情况下从多个活动中开始一项活动?

时间:2018-07-08 21:42:52

标签: java android dry code-reuse

我正在开发一个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);
    }
}

3 个答案:

答案 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);
        }
    });
  }
}