![](/img/trans.png)
[英]How to Call my Fragment's TextViews and Button from my Activity?
[英]Call Activity's methods from fragment
介绍
我有一个包含一个Activity的蓝牙应用程序,该Activity具有3个可以执行的按钮:
我有以下课程:
现在,我需要稍微更改一下设计,而不是进行所有这些活动,而是使用ActionBar上的Tabs创建两个片段:服务器和客户端。
因此,基本上,我必须在Server片段中定义Server和send按钮,在Client片段中定义client按钮,并设置其侦听器。
题
对于每个片段,当使用一个按钮时,我应该调用其对应的方法,该方法在主Activity中是公开的。 我想这样做,而不是复制每个片段中的所有方法和接口,只是为了使其更简单。
我尝试将方法设置为静态,但是方法内部有一些无法用静态引用调用的定义。 例:
public class ServerFragment extends Fragment {
//...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.server_layout, container, false);
btnServer = (Button) view.findViewById(R.id.buttonServer);
btnServer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onClickServer();
}
});
//...
_
public class BluetoothActivity extends Activity {
//...
public void onClickServer() {
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 120);
startActivityForResult(discoverableIntent, REQUEST_DISCOVERABLE);
}
如果将onClickServer()
设置为静态,则也必须将REQUEST_DISCOVERABLE
设置为静态,并且startActivityForResult()
不允许我在此处使用静态变量。
我该怎么办?
更新-抛出NullpointerException
我创建了名为ClickInterface的新类作为建议,并在其中定义了2个接口,一个用于服务器,另一个用于客户端。
不,从片段开始,我试图在onClick方法中调用该方法,但是在我对回调方法的调用所在的行中抛出了一个NPE:
public class ServerFragment extends Fragment implements OnClickListener {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.server_layout, container, false);
btnServer = (Button) view.findViewById(R.id.buttonServer);
btnServer.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.buttonServer:
serverFragCallback.onServer(); //HERE I RECEIVE THE NPE
break;
}
}
这是logcat的输出:
03-20 16:33:57.581: E/AndroidRuntime(24884): FATAL EXCEPTION: main
03-20 16:33:57.581: E/AndroidRuntime(24884): Process: com.uax.bluetoothconnection, PID: 24884
03-20 16:33:57.581: E/AndroidRuntime(24884): java.lang.NullPointerException
03-20 16:33:57.581: E/AndroidRuntime(24884): at com.uax.bluetoothconnection.ServerFragment.onClick(ServerFragment.java:43)
03-20 16:33:57.581: E/AndroidRuntime(24884): at android.view.View.performClick(View.java:4633)
03-20 16:33:57.581: E/AndroidRuntime(24884): at android.view.View$PerformClick.run(View.java:19330)
03-20 16:33:57.581: E/AndroidRuntime(24884): at android.os.Handler.handleCallback(Handler.java:733)
03-20 16:33:57.581: E/AndroidRuntime(24884): at android.os.Handler.dispatchMessage(Handler.java:95)
03-20 16:33:57.581: E/AndroidRuntime(24884): at android.os.Looper.loop(Looper.java:157)
03-20 16:33:57.581: E/AndroidRuntime(24884): at android.app.ActivityThread.main(ActivityThread.java:5356)
03-20 16:33:57.581: E/AndroidRuntime(24884): at java.lang.reflect.Method.invokeNative(Native Method)
03-20 16:33:57.581: E/AndroidRuntime(24884): at java.lang.reflect.Method.invoke(Method.java:515)
03-20 16:33:57.581: E/AndroidRuntime(24884): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
03-20 16:33:57.581: E/AndroidRuntime(24884): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
03-20 16:33:57.581: E/AndroidRuntime(24884): at dalvik.system.NativeStart.main(Native Method
使所有内容保持静态是进行此操作的错误方法。 做这个:
getActivity()
为接口并调用方法。 (请记住要事先检查,即, if (getActivity() instanceof MyInterface) ...
您想要的是一个用于从Fragment到Activity进行通信的回调接口。 该文档已经提供了一个很好的例子。
定义您的Activity实现的接口:
public interface Callback {
void doSomething();
}
public class YourActivity implements Callback {
...
@Override
public void doSomething() {
// your implementation here
}
}
如果单击按钮之一,则在片段中使用此界面。
public class ServerFragment extends Fragment {
Callback iCallback;
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
iCallback = (Callback) activity;
} catch (ClassCastException e) {
throw new ClassCastException();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.server_layout, container, false);
btnServer = (Button) view.findViewById(R.id.buttonServer);
btnServer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
iCallback.doSomething();
}
});
}
}
使用这种方法,您可以将逻辑留在“活动”中,并在“片段”中处理UI事件。 通过Fragment中的事件,您可以调用Activity中的方法。
正如克里斯所说,您已经让您的活动实现了一个接口,比如说ClickInterface:
public class BluetoothActivity extends Activity implements ClickInterface{
//...
@override
public void onClickServer() {
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 120);
startActivityForResult(discoverableIntent, REQUEST_DISCOVERABLE);
}
界面将是这样的:
public interface ClickInterface {
public void onClickServer();
}
这是你的片段:
public class ServerFragment extends Fragment {
private ClickInterface mCallback;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallback = (ClickInterface) activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.server_layout, container, false);
btnServer = (Button) view.findViewById(R.id.buttonServer);
btnServer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mCallback.onClickServer();
}
});
}
因此,您正在mCallback对象上调用“ onClickServer()”方法,该方法将在活动中被调用,因为它实现了接口
使用接口从任何片段页面的Activity中调用方法,例如:
public interface OnServerClickListener {
public void onUserClickServer();
}
在活动中:
public class BluetoothActivity extends Activity implements OnServerClickListener {
//...
public void onUserClickServer() {
onClickServer();
}
}
现在,您可以使用以下片段:
public class ServerFragment extends Fragment {
//...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.server_layout, container, false);
btnServer = (Button) view.findViewById(R.id.buttonServer);
btnServer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try{
((OnServerClickListener)getActivity()).onUserClickServer();
}
catch(Exception e){Log.e("ServerFragment","Main Activity doesnt implement OnServerClickListener");
}
});
请享用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.