首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义接口不工作活动

自定义接口不工作活动
EN

Stack Overflow用户
提问于 2017-02-08 07:09:52
回答 5查看 1.2K关注 0票数 0

我在创建界面方面还是新手。我参考了很多教程,但仍然不起作用。我想将值从一个活动传递到另一个片段。mListener为空。

如何正确地调用听者?

接口

代码语言:javascript
复制
public interface ListenerCardDetails {
    void getCardSelected(String id);
}

MainActivity.java

代码语言:javascript
复制
public class CardDetailsActivity extends AppCompatActivity {

private ListenerCardDetails mListener;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // some stuff
    mListener.getCardSelected("20");
}

public void setListener(ListenerCardDetails mListener) {
        this.mListener = mListener;
    }

MyFragment.java

代码语言:javascript
复制
public class TabPoints extends Fragment implements ListenerCardDetails {

    private CardDetailsActivity mCardDetailsActivity;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_tab_points, container, false);
        configView(view);
        return view;
    }

    private void configView(View view){
        ((CardDetailsActivity) getActivity()).setListener(this);
    }

    @Override
    public void getCardSelected(String id) {
         Toast.makeText(getActivity(), id, Toast.LENGTH_LONG).show();
    }
}

误差

android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548):无法实例化活动java.lang.InstantiationException: java.lang.Class在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)没有零参数构造函数,原因是: java.lang.InstantiationException: java.lang.Class在java.lang.Class.newInstance(原生方法)没有零参数构造函数

任何帮助都是非常感谢的。

EN

回答 5

Stack Overflow用户

发布于 2017-02-08 07:16:37

无法实例化活动java.lang.InstantiationException: java.lang.Class没有零参数构造函数

这正好告诉你发生了什么。在Android中,不允许使用自定义构造函数创建任何ActivityFragment。这是因为Android框架使用引擎盖下的反射来实例化它们。

如果您想在ActivityFragment之间进行通信,应该在Fragment中使用onAttach(Context context)

请参阅Android https://developer.android.com/training/basics/fragments/communicating.html的官方文档。

票数 0
EN

Stack Overflow用户

发布于 2017-02-08 07:24:15

您可以做的就是在Interface中定义Fragment并向其中添加void getCardSelected(String id);方法。在Activity中实现相同的接口,重写接口方法,并在该方法中写入逻辑。

要获得更多解释,请参阅本教程

如果要将值从Activity发送到Fragment,请遵循以下链接:在android中将数据从活动发送到片段

希望它能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2017-02-08 07:32:56

不要使用自定义构造函数,而是使用setListener。

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    private ListenerCardDetails mListener;

    public void setListener(ListenerCardDetails mListener) {
        this.mListener = mListener;
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // some stuff
        mListener.getCardSelected("20");
    }


    public class TabPoints extends Fragment implements ListenerCardDetails {

        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_tab_points, container, false);
            configView(view);
            return view;
        }

        private void configView(View view){
            ((MainActivity) getActivity()).setListener(this);
        }


        @Override
        public void getCardSelected(String id) {
            Toast.makeText(getActivity(), id, Toast.LENGTH_LONG).show();
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42106814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档