有一种情况我需要将活动及其按钮传递给java类。
我做了以下工作并且工作正常,我只担心它是否正确地整合了它。
MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= findViewById(R.id.btn);
UIComponents uiComponents= new UIComponents();
uiComponents.setActivity(this, button);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d("result", String.valueOf(requestCode));
}
UIComponents.class
public class UIComponents {
public void setActivity(final AppCompatActivity activity, Button btn){
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(activity, ResultActivity.class);
activity.startActivityForResult(intent, 999);
}
});
}
此功能非常好,它在我的活动屏幕上显示toast
消息,我也能够在我的活动中收到onActivityResult
回调。我担心这是否会导致任何与性能相关的问题。
答案 0 :(得分:1)
你只能传递Button并使用getContext方法,例如
public class UIComponents {
public void setActivity(Button btn){
Context activity = btn.getContext();
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent= new Intent(activity, ResultActivity.class);
activity.startActivityForResult(intent, 999);
}
});
}
答案 1 :(得分:1)
这里要考虑的最重要的事情是组件的生命周期。通常,您不应该将对活动的引用传递给任何可能比它活跃的对象。从理论上讲(可能非常后方),您的活动可能会在用户单击按钮和OnClickListener
(如果尚未收集垃圾)的时间之间被杀死,并且您可以执行此操作。得到一个NullPointerException
。此外,您可能会(甚至意外地)将UIComponents
传递给具有不同生命周期的其他对象。
在这种情况下的最佳做法通常是使用MVP架构。处理按钮点击的具体情况在其他地方描述here。
此外,遵循" Guide to App Architecture"谷歌可能是一个好主意。