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
方法,并将接口实例强制转换为活动,以便稍后我可以在调用方活动中调用接口实现。我的问题是,当您向某个活动投射接口时,它到底意味着什么?它确实有效,我可以将数据从片段传递到调用方活动,但我不明白它真正实现了什么。你介意告诉我这一点吗?确切地说,我将接口实例转换为上下文(而不是活动)