【问题标题】:How can I use an interface to create a simple bridge between two activities?如何使用界面在两个活动之间建立一个简单的桥梁?
【发布时间】:2020-08-22 04:02:38
【问题描述】:

我正在尝试学习如何在我的 android JAVA 代码中使用接口。我已经创建了这个简单的应用程序,它希望在 MainActivity 中单击按钮时显示祝酒词,但我想通过界面和 SecondActivity 来实现这一点.....但我无法完成工作.....因为SecondActivity中的接口实例在执行onCreate方法时被调试器显示为空。

显然,逻辑不正确,但我无法弄清楚到底是什么问题......我正在自学,非常感谢任何帮助!

我是一个完整的初学者,所以请善待。

另外,我已包含以下所有代码:


公共类 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();
}

}


公共接口接口{

void showOnClick ();

}


公共类 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);
        }
    }
}

【问题讨论】:

    标签: java android interface observer-pattern


    【解决方案1】:

    我只是说明你做错了什么。

    myMain2 = new SecondActivity();
    myMain2.setMyInterface(this);
    
    mainIntent = new Intent(MainActivity.this, SecondActivity.class);
    startActivity(mainIntent);
    

    您为 myMain2 设置了界面,但是当来自按钮的显示活动 Android 不显示您的 myMain2 时,它将根据您传递的 Intent 创建一个 SecondActivity 的新实例。这意味着当 SecondActivity 调用 onCreate 时,它​​没有 myInterface 的实例。

    两个活动之间的通信基本上应该使用 startActivityForResult 或使用广播或事件总线模式的一些特殊情况

    【讨论】:

    • 这有助于理解为什么“myInterface”实例在第二个活动启动时为空,但我仍然不知道如何解决它.....请您进一步详细说明?不过,谢谢。
    • 简单的交流,你在SecondActivity中执行一些动作,事件你传递给MainActivity,不需要立即从MainActivity显示Toast。从按钮启动 SecondActivity 时尝试了解 startActivityForResult。在 SecondActivity 中完成后不要忘记调用 setResult 和 finnish()。我已经说过一些特殊情况,当你想立即传递数据时,你可以使用广播或事件总线库
    • 我知道这个例子供你参考,如果你给我你到底想做什么我会给你特别推荐!
    • 我会学习startActivityForResult.......然后再试一次......|但是我还有一个与此相关的问题,我创建了一个片段,它在其 onAttach() 方法中将自身绑定到一个接口,但我不明白它是如何工作的......。这是我不要得到: // public void onAttach(Context context){ this.listener = (Listener)context; // Listener 是接口, listener 是我 Fragment 中 Listener 的实例。
    • 好吧,我解释一下,你想知道为什么fragment可以和activity一起使用而两个activity都不对吗?
    猜你喜欢
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多