Android 使用接口将数据从活动传递到片段
在我的应用程序中,我有一个选择器控件(在片段中),当用户单击它时,一个新的菜单活动将显示一些项目列表,当用户单击任何项目时,活动将完成,界面应将所选项目字符串再次传输到片段中的选择器 以下是我的菜单活动:Android 使用接口将数据从活动传递到片段,android,interface,Android,Interface,在我的应用程序中,我有一个选择器控件(在片段中),当用户单击它时,一个新的菜单活动将显示一些项目列表,当用户单击任何项目时,活动将完成,界面应将所选项目字符串再次传输到片段中的选择器 以下是我的菜单活动: public class Menu extends AppCompatActivity { ListView listView; public interface ItemListener { void getItem(String s); }
public class Menu extends AppCompatActivity {
ListView listView;
public interface ItemListener {
void getItem(String s);
}
ItemListener itemListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
// Error Goes Here
itemListener = (ItemListener) this;
// Define and fill the list view
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
itemListener.getItem("Some Item");
finish();
}
});
}
}
但是我得到了一个错误:
Caused by: java.lang.ClassCastException: Menu cannot be cast to Menu$ItemListener
我错了,任何帮助都会非常感激的从你现在的评论中可以更清楚地看到你想做什么<代码>片段很大程度上取决于
活动
,它实际上无法独立运行,任何接口实现都会在onAttach()
期间被捕获,片段
的上下文是活动
所以如果活动
未实现接口,则会在onAttach()中发生崩溃
在片段中
但在您的场景中,您有两个不同的活动
,因此在这种情况下,您可以使用捆绑
或广播接收器
传递数据。要使用broadcastReceiver
在片段中创建一个方法
:
private void registerReciver() {
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String getData = intent.getStringExtra("data");
}
}
};
IntentFilter intentFilter = new IntentFilter("action");
this.registerReceiver(receiver, intentFilter);
}
调用registerReciver()代码>在片段onCreate()
方法中。现在,从第二个活动
关闭它的地方,启动广播接收器
发送一些数据:
Intent intent = new Intent();
intent.putExtra("data", "some data");
intent.setAction("action");
this.sendBroadcast(intent);
第二种方法在片段
覆盖onResume
方法中也应该有效,该方法将在活动
第二个活动
完成后调用。在活动中
将数据放入包中
如下:
Addorder fragment = new Addorder();
Bundle bundle = new Bundle();
bundle.putString("data", "Some data");
fragment.setArguments(bundle);
而在onResume()中的Fragment
方法中获取数据:
Bundle bundle = this.getArguments();
if (bundle != null) { //to prevent crash must check against null
String getData = bundle.getString("data", defaultValue);
}
我认为这两种方法都应该有效,在我看来,听者是无用的。在Addorder
中,您应该使用startActivityForResult()
打开菜单活动。在菜单中设置结果后,您将在片段的onActivityResult
回调中收到它。下面是一个示例:您的活动
没有实现您的接口。您还需要在活动中实现它。为什么我的活动应该实现侦听器?picker控件位于片段中,不在活动中。两个解决方案都抛出错误且不工作!第一种解决方案:涉及菜单的循环继承,第二种解决方案:Main不能被转换到菜单片段
很大程度上取决于活动
,它实际上不能独立运行,任何接口实现都会在onAttach()期间被捕获,Fragment
的上下文是Activity
,因此如果Activity
未实现接口
将在onAttach()
中发生崩溃。我已经编辑了代码。错误出现在implements
removeMenu
中。不起作用,请更清楚我的片段父项是主要活动(BottomNavigationView中的片段),选择器在片段中,菜单活动是独立活动,我想将数据从菜单活动传递到附加了activity
fragment的addOrder fragments?这是主要问题,如果片段
附加在MainActivity
上,则需要在MainActivity
中实现接口。如果您试图将数据从一个活动
传递到附加到另一个活动
的片段
,则此带有接口的部分将无法工作,您不能这样传递数据。这就是你想做的吗?谢谢,伙计,完美的解决方案
Bundle bundle = this.getArguments();
if (bundle != null) { //to prevent crash must check against null
String getData = bundle.getString("data", defaultValue);
}