从通话片段活动的方法(Call Activity's methods from fragme

2019-10-19 15:38发布

介绍

我有一个蓝牙的应用程序,包括其上有3个按钮,做了一个活动:

  • 上设置的知名度,并创建一个服务器连接
  • 查找设备,并创建一个客户端连接
  • 送东西

我有以下类别:

  • 主要活动:在那里我有所有的方法,和按钮听众
  • 3个不同的类与主题:ClientConnection,一个ServerConnection和ConnectedThread

现在,我必须改变德兴一点点,而不是有这一切一项活动,使用标签上的动作条,我需要创建2个片段:服务器和客户端。

所以,基本上,我需要定义服务器和服务器片段发送按钮,并在客户端片段客户按钮,并设置他们的听众。

从每个片段,利用一个按钮时,我应该调用在主活动ubicated其相应的方法。 我想这样来做,而不是复制所有在每个片段的方法和接口,只需要有它simplier。

我尝试设置方法为静态的,但也有不能用静态引用来调用的方法里面的一些定义。 例:

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()不会让我用一个静态变量存在。

我怎么能这样做?

UPDATE -投掷的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

Answer 1:

你需要的是从一个片段的活动通信的回调接口。 该文档已经提供了一个很好的例子。

定义,你的活动实现的接口:

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事件。 通过在片段中的事件,你可以调用你的活动的方法。



Answer 2:

让一切静是错误的路要走这一点。 做这个:

  1. 定义一个新的界面,你需要从你的片段调用的方法
  2. 让你的活动实现的接口
  3. 在你的片段,投getActivity()到您的接口和调用的方法。 (记住要事先检查,即if (getActivity() instanceof MyInterface) ...


Answer 3:

克里斯说,你有恩让你的活动实现一个接口,让我们说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()”方法,而这种方法将在活动中被调用,因为它实现了接口



Answer 4:

使用接口从活动的任何片段页面中调用方法,例如:

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");
        }
    });

请享用!



文章来源: Call Activity's methods from fragment