使用我的App时,我有一个Picker控件(在片段中),当用户单击它时,将显示一个新的Menu Activity,其中包含一些Items列表;当用户单击任何一项时,Activity将完成,并且界面应传输所选的Item字符串片段中再次显示给选择器,
这是我的菜单活动:
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();
}
});
}
}
我的片段:
public class Addorder extends Fragment implements Menu.ItemListener {
Picker picker;
public Addorder() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_addorder, container, false);
picker = (Picker) view.findViewById(R.id.picker);
return view;
}
@Override
public void getItem(String s) {
picker.setChosenItem(s);
}
}
但是我正在投射错误:
Caused by: java.lang.ClassCastException: Menu cannot be cast to Menu$ItemListener
我是董错,任何帮助将不胜感激
答案 0 :(得分:1)
从您现在的评论中可以更清楚地知道您要做什么。 Fragment
严重依赖于Activity
,它实际上不能独立存在,在onAttach()
期间会捕获任何接口实现,Fragment
的上下文是Activity
,因此如果Activity
未实现接口崩溃,则会在Fragment的onAttach()
中发生。
但是在您的方案中,您有两个不同的Activities
,因此在这种情况下,您可以使用Bundle
或BroadcastReceiver
传递数据。要使用BroadcastReciver
,请在Fragment
内创建一个方法:
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()
。现在从关闭它的第二个Activity
开始,触发BroadcastReceiver
发送一些数据:
Intent intent = new Intent();
intent.putExtra("data", "some data");
intent.setAction("action");
this.sendBroadcast(intent);
在Fragment
覆盖onResume
方法中应能正常工作的第二种方法,该方法将在Activity
秒Activity
完成后调用。在Activity
中,将数据放入Bundle
中,例如:
Addorder fragment = new Addorder();
Bundle bundle = new Bundle();
bundle.putString("data", "Some data");
fragment.setArguments(bundle);
比在Fragment
方法的onResume()
内部获取数据:
Bundle bundle = this.getArguments();
if (bundle != null) { //to prevent crash must check against null
String getData = bundle.getString("data", defaultValue);
}
我认为两种方法都应该起作用
答案 1 :(得分:1)
在我看来,听众是没有用的。在Addorder
中,您应该使用startActivityForResult()
打开菜单活动。在Menu
中设置结果后,您将在片段的onActivityResult
回调中收到它。以下是示例操作方法:How to manage startActivityForResult on Android?