Java 活动中的铸造界面

Java 活动中的铸造界面,java,android,Java,Android,问题是,在此之前,我在活动中实现了接口,值​​片段中设置的方法的数量。也就是说,在onAttach()中初始化,然后在何处调用调用的接口方法。例如: interface OnNumberChangeCallback{ void onSuccess(); } 在片段中: OnNumberChangeCallback onNumberChangeCallback; onAttach(Context context){ onNumberChangeCallback = (OnNum

问题是,在此之前,我在
活动
中实现了
接口
,值​​
片段
中设置的方法的数量。也就是说,在
onAttach()
中初始化,然后在何处调用调用的
接口
方法。例如:

interface OnNumberChangeCallback{
    void onSuccess();
}
片段中

OnNumberChangeCallback onNumberChangeCallback;

onAttach(Context context){
    onNumberChangeCallback = (OnNumberChangeCallback) context;
}
等等

我想在
BaseActivity
中初始化
接口。并在
片段
中实现此
接口
。当我尝试以以下方式在
onCreate
方法中初始化时:

onNumberChangeCallback = (OnNumberChangeCallback) this;
我得到一个错误:

BaseActivity cannot be cast to OnNumberChangeCallback

问题:如何在
活动
中正确初始化
接口

如果要将上下文强制转换到接口,则不能。我在这个抽象类中使用抽象类和扩展AppCompatActivity,并使用abtract方法

public abstract class AbstractActivity extends AppCompatActivity {

   public abstract  void someAbstractMethod();

}


现在,您可以将上下文转换为AbstractActivity并调用该方法。

听起来您希望片段实现接口,并让活动以某种方式存储对它的引用

您的界面:

interface OnNumberChangeCallback {
    void onSuccess();
}
要在片段中实现它,请执行以下操作:

public class MyFragment extends Fragment implements OnNumberChangeCallback {

    @Override
    public void onSuccess() {
        // TODO
    }

    // other fragment methods, like onCreateView() etc
}
要在活动中保存侦听器,请执行以下操作:

public class MyActivity extends AppCompatActivity {

    private OnNumberChangeCallback callback;

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);

        if (fragment instanceof OnNumberChangeCallback) {
            callback = (OnNumberChangeCallback) fragment;
        }
    }

    // other activity methods, like onCreate() etc
}
public void onButtonClick() {
    if (callback != null) {
        callback.onSuccess();
    }
}
然后,要使用回调函数,您可以在活动中的任何位置编写如下内容:

public class MyActivity extends AppCompatActivity {

    private OnNumberChangeCallback callback;

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);

        if (fragment instanceof OnNumberChangeCallback) {
            callback = (OnNumberChangeCallback) fragment;
        }
    }

    // other activity methods, like onCreate() etc
}
public void onButtonClick() {
    if (callback != null) {
        callback.onSuccess();
    }
}
此解决方案的根源在于
FragmentActivity
(它是
AppCompatActivity
的超类)具有一个方法
onAttachFragment()
,该方法在片段附加到活动时随时调用。通过使用
onAttach()
上下文
强制转换为片段内的接口,同样,您可以使用
onAttachFragment()
片段
强制转换为接口

文件:

PS:这个答案提供了一个非常通用的解决方案,它几乎适用于任何向活动添加片段的方式。但是,如果您知道片段将以特定的方式添加,那么您可能可以做一些比实现
onAttachFragment()
简单得多的事情。。。您可以在将片段添加到活动时强制转换片段,如下所示:

    MyFragment fragment = new MyFragment();
    callback = fragment;

    getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.content, fragment, "fragmentTag")
            .commit();

您不是在接口中实现,而是在活动中实现。或者您的活动没有实现,正如错误所说,您需要强制转换什么?如果
实现了该接口,则强制转换是冗余的。当我单击
按钮
时,我想调用
活动
中的
onSuccess()
方法,以便
片段
中的
文本视图
立即更改文本。您能显示一个吗?您实际在哪里实现接口?您可以直接从活动调用
fragment.setSuccess
,问题所问的片段在哪里?在问题中,fragment有一个onAttach(上下文)方法。现在,您可以将上下文变量强制转换为AbstractActivity。如何初始化itI当我发现这个问题时,我想问一个非常类似的问题。我在片段中使用了
OnAttach
方法,并将接口实例强制转换为活动,以便稍后我可以在调用方活动中调用接口实现。我的问题是,当您向某个活动投射接口时,它到底意味着什么?它确实有效,我可以将数据从片段传递到调用方活动,但我不明白它真正实现了什么。你介意告诉我这一点吗?确切地说,我将接口实例转换为上下文(而不是活动)