使用接口将数据从活动传递到片段

时间:2019-01-15 15:49:24

标签: android interface

使用我的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

我是董错,任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

从您现在的评论中可以更清楚地知道您要做什么。 Fragment严重依赖于Activity,它实际上不能独立存在,在onAttach()期间会捕获任何接口实现,Fragment的上下文是Activity,因此如果Activity未实现接口崩溃,则会在Fragment的onAttach()中发生。

但是在您的方案中,您有两个不同的Activities,因此在这种情况下,您可以使用BundleBroadcastReceiver传递数据。要使用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方法中应能正常工作的第二种方法,该方法将在ActivityActivity完成后调用。在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?