如何使用界面在两个活动之间创建一个简单的桥梁?
How can I use an interface to create a simple bridge between two activities?
我正在尝试学习如何在我的 android JAVA 代码中使用接口。我创建了这个简单的应用程序,当在 MainActivity 中单击按钮时,它想要显示祝酒词,但我想通过界面和 SecondActivity 来实现这一点......但我无法完成工作.....因为调试器在执行其 onCreate 方法时将 SecondActivity 中的接口实例显示为 null。
显然,逻辑不对,但我无法弄清楚到底哪里出了问题.....我正在自学,非常感谢任何帮助!
我是一个完全的初学者,所以请多多关照。
此外,我已经包含了以下所有代码:
public class MainActivity 扩展 AppCompatActivity 实现接口 {
Button myButton;
Intent mainIntent;
SecondActivity myMain2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = findViewById(R.id.button);
myMain2 = new SecondActivity();
myMain2.setMyInterface(this);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mainIntent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(mainIntent);
}
});
}
@Override
public void showOnClick() {
Toast.makeText(myMain2, "Clicked!", Toast.LENGTH_SHORT).show();
}
}
public界面界面{
void showOnClick ();
}
public class SecondActivity 扩展 AppCompatActivity {
private Interface myInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
if (myInterface != null) {
myInterface.showOnClick();
}
}
public void setMyInterface(Interface myInterface){
this.myInterface = myInterface;
}
}
提前致谢!
编辑(1):
public class MainActivity extends AppCompatActivity implements
MyInterface{
Intent intent_mainActivity;
WorkoutListFragment myWorkoutFrag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myWorkoutFrag = new WorkoutListFragment();
myWorkoutFrag.setListener(this);
}
@Override
public void itemClicked(long id) {
intent_mainActivity = new Intent(this, DetailActivity.class);
intent_mainActivity.putExtra(DetailActivity.EXTRA_WORKOUT_ID,
(int)id);
startActivity(intent_mainActivity);
}
}
public interface MyInterface {
void itemClicked(long id);
}
public class WorkoutListFragment extends ListFragment {
public WorkoutListFragment() {}
private MyInterface listener;
public void setListener(MyInterface myInterface){
this.listener = myInterface;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String [] names = new String[Workout.workouts.length];
for (int i = 0; i < names.length; i++){
names[i] = Workout.workouts[i].getName();
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(
inflater.getContext(), android.R.layout.simple_list_item_1,
names);
setListAdapter(adapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
//
// @Override
// public void onAttach(Context context) {
// super.onAttach(context);
// this.listener = (MyInterface)context;
// }
@Override
public void onListItemClick(ListView listView, View itemView, int
position, long id){
if (listener != null){
listener.itemClicked(id);
}
}
}
我只是指出你做错了什么。
myMain2 = new SecondActivity();
myMain2.setMyInterface(this);
mainIntent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(mainIntent);
您为 myMain2 设置了界面,但是当从按钮 Android 显示 activity 时没有显示您的 myMain2,它将根据您传递的 Intent 创建一个新的 SecondActivity 实例。这意味着当 SecondActivity 调用 onCreate 时它没有 myInterface 的实例。
基本上 2 activity 之间的通信应该使用 startActivityForResult 或使用广播或事件总线模式的一些特殊情况
我正在尝试学习如何在我的 android JAVA 代码中使用接口。我创建了这个简单的应用程序,当在 MainActivity 中单击按钮时,它想要显示祝酒词,但我想通过界面和 SecondActivity 来实现这一点......但我无法完成工作.....因为调试器在执行其 onCreate 方法时将 SecondActivity 中的接口实例显示为 null。
显然,逻辑不对,但我无法弄清楚到底哪里出了问题.....我正在自学,非常感谢任何帮助!
我是一个完全的初学者,所以请多多关照。
此外,我已经包含了以下所有代码:
public class MainActivity 扩展 AppCompatActivity 实现接口 {
Button myButton;
Intent mainIntent;
SecondActivity myMain2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = findViewById(R.id.button);
myMain2 = new SecondActivity();
myMain2.setMyInterface(this);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mainIntent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(mainIntent);
}
});
}
@Override
public void showOnClick() {
Toast.makeText(myMain2, "Clicked!", Toast.LENGTH_SHORT).show();
}
}
public界面界面{
void showOnClick ();
}
public class SecondActivity 扩展 AppCompatActivity {
private Interface myInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
if (myInterface != null) {
myInterface.showOnClick();
}
}
public void setMyInterface(Interface myInterface){
this.myInterface = myInterface;
}
}
提前致谢!
编辑(1):
public class MainActivity extends AppCompatActivity implements
MyInterface{
Intent intent_mainActivity;
WorkoutListFragment myWorkoutFrag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myWorkoutFrag = new WorkoutListFragment();
myWorkoutFrag.setListener(this);
}
@Override
public void itemClicked(long id) {
intent_mainActivity = new Intent(this, DetailActivity.class);
intent_mainActivity.putExtra(DetailActivity.EXTRA_WORKOUT_ID,
(int)id);
startActivity(intent_mainActivity);
}
}
public interface MyInterface {
void itemClicked(long id);
}
public class WorkoutListFragment extends ListFragment {
public WorkoutListFragment() {}
private MyInterface listener;
public void setListener(MyInterface myInterface){
this.listener = myInterface;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String [] names = new String[Workout.workouts.length];
for (int i = 0; i < names.length; i++){
names[i] = Workout.workouts[i].getName();
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(
inflater.getContext(), android.R.layout.simple_list_item_1,
names);
setListAdapter(adapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
//
// @Override
// public void onAttach(Context context) {
// super.onAttach(context);
// this.listener = (MyInterface)context;
// }
@Override
public void onListItemClick(ListView listView, View itemView, int
position, long id){
if (listener != null){
listener.itemClicked(id);
}
}
}
我只是指出你做错了什么。
myMain2 = new SecondActivity();
myMain2.setMyInterface(this);
mainIntent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(mainIntent);
您为 myMain2 设置了界面,但是当从按钮 Android 显示 activity 时没有显示您的 myMain2,它将根据您传递的 Intent 创建一个新的 SecondActivity 实例。这意味着当 SecondActivity 调用 onCreate 时它没有 myInterface 的实例。
基本上 2 activity 之间的通信应该使用 startActivityForResult 或使用广播或事件总线模式的一些特殊情况