通过接口在类和活动之间进行通信

时间:2017-09-14 11:11:12

标签: android interface

我想要使用接口与类通信的MainActivity

public interface MyInterface(){
    public void doAction();
}

在我的MainActivity中,我将获得这段代码:

public class MainActivity extends AppCompatActivity implements MyInterface(){

    //....some more code here

    @Override
    public void doAction() {
        //any code action here
    }

    //....some more code here

}

所以现在,如果我有另一个类(NOT ACTIVITY),我应该如何正确地建立类--- interface --- mainActivity之间的链接?

public class ClassB {

    private MyInterface myinterface;
    //........

    //...... how to initialize the interface
}

我对如何初始化和使用ClassB中的接口感到困惑

4 个答案:

答案 0 :(得分:1)

在其他类的构造函数中:ClassB,接受接口作为参数并传递Activity的引用,在Activity中保留该对象。

像这样:

public class MainActivity extends AppCompatActivity implements MyInterface()
{
    private ClassB ref; // Hold reference of ClassB directly in your activity or use another interface(would be a bit of an overkill)

    @Override
    public void onCreate (Bundle savedInstanceState) {
        // call to super and other stuff....
        ref = new ClassB(this); // pass in your activity reference to the ClassB constructor!
    }

    @Override
    public void doAction () {
        // any code action here
    }
}

public class ClassB
{
    private MyInterface myinterface;

    public ClassB(MyInterface interface)
    {
        myinterface = interface ;
    }

    // Ideally, your interface should be declared inside ClassB.
    public interface MyInterface
    {
         // interface methods
    }
}

仅供参考,这也是View和Presenter类在MVP设计模式中的交互方式。

答案 1 :(得分:1)

public class MainActivity extends AppCompatActivity implements 
MyInterface
{
    OnCreate()
    {
        ClassB classB= new ClassB(this);
    }
}

public class ClassB
{
    private MyInterface myinterface;

    public ClassB(MyInterface myinterface)
    {
        this.myinterface=myinterface;
    }

    void anyEvent() // like user click
    {
        myinterface.doAction();
    }
}

答案 2 :(得分:0)

public class MainActivity extends AppCompatActivity implements MyInterface(){
    private ClassB ref;

    @Override
    public void onCreate (Bundle savedInstanceState) {
        ref = new ClassB(); 
        ref.setMyinterface(this);
    }

    @Override
    public void doAction () {
        // any code action here
    }
}

public class ClassB{
    private MyInterface myinterface;

    public setMyInterface(MyInterface interface){
      myinterfece = interface;
    }
    public interface MyInterface{
         // interface methods
    }
}

答案 3 :(得分:0)

//-------------------------------------
//Two way communication using Interface
//-------------------------------------

//A. Interfaces  
//Communicator Interface ( Activity to Fragment )
public interface CommunicateToFragment {
    public void CallBack(String name);
}

// Communicator Interface ( Fragment to Main )
public interface CommunicateToMain {
    public void respond(String data);
}

//B. Main Class implements CommunicateToMain Interface
//Use CommunicateToFragment interface to send data in FragmentA
public class MainActivity extends AppCompatActivity implements CommunicateToMain {
    private CommunicateToFragment communicateToFragment;
    
    public void setCommunicateToFragment(CommunicateToFragment communicateToFragment) {
        this.communicateToFragment = communicateToFragment;
    }

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    public void respond (String data) {
        communicateToFragment.CallBack("Callbacked when onCreate method Created" + data);
        Log.d("test","get result from fragment: " + data);
        FragmentManager manager = getFragmentManager();
        FragmentB f2 = (FragmentB) manager.findFragmentById(R.id.id_fragment2);
        f2.changeText(data);
    }
}


//C. FragmentA implements CommunicateToFragment
//Use CommunicateToMain interface to send data in MainActivity
public class FragmentA extends Fragment implements View.OnClickListener, CommunicateToFragment{
    Button button;
    int counter=0;
    CommunicateToMain commToMain;

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

    @Override
    public void onActivityCreated (@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        commToMain = (CommunicateToMain) getActivity();
        button = getActivity().findViewById(R.id.button);
        button.setOnClickListener(this);
        if(getActivity() instanceof MainActivity){
            ((MainActivity) getActivity()).setCommunicateToFragment(this);
        }
    }

    @Override
    public void onClick (View view) {
        counter++;
        commToMain.respond("The button was clicked" + counter + " Times");
    }

    @Override
    public void CallBack(String name) {
        Log.d("test","get result from main activity: " + name);
    }
}