从片段到活动创建多个事件回调

时间:2017-07-13 14:01:33

标签: android android-fragments android-activity

我能够从片段到活动创建单个事件回调。但是,我在从同一个片段创建两个事件回调时遇到问题。 基本上,我在fragment1布局上有一个按钮,当点击它时,它会在mainactivity中执行一些东西,然后,它会更改在fragment1布局中隐藏Button,然后我需要从片段发送一个布尔值到activity,然后启动fragment2。

如何在mainacativity中实现第二个回调接口。

这是我的代码: 在Fragment1:

public class Fragment1 extends Fragment{

private static final String TAG = "Fragment1";

Boolean in1, in2;
Button btn1;

ListenerA mListenerA;

public interface ListenerA{
    public void methodA(Boolean in1);
};

ListenerB mListenerB;

public interface ListenerB{
    public void methodB(Boolean in2);
};

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    if(context instanceof ListenerA)
        mListenerA = (ListenerA)context;

    if(context instanceof ListenerB)
        mListenerB = (ListenerB)context;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View myView = inflater.inflate(R.layout.fragment1, container, false);

    btn1 = (Button) myView.findViewById(R.id.btn1_ID);
    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mListenerA.methodA(true);
        }
    });     
    return myView;
}

public void showBtnMethod (Boolean showBtn){
    if (showBtn==false) {
        btn1.setVisibility(View.INVISIBLE);

        mListenerB.methodB(true); //***** problematic line
    }
}
}

主要活动中的代码如下。请注意,在第一行我只能从片段中实现一个方法。

public class MainActivity extends AppCompatActivity implements Fragment1.ListenerA {

private static final String TAG = "MainActivity";
public Fragment1 mFragment1;
public Fragment2 mFragment2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        FragmentTransaction transaction1 = getSupportFragmentManager().beginTransaction();
        mFragment1 = new Fragment1();
        transaction1.replace(R.id.content_fragment_ID, mFragment1);
        transaction1.commit();
    }
}

// this gets called by ListenerA when click on the button
public void methodA(Boolean in){
    if (in==true){
        Toast.makeText(MainActivity.this, "mMethodA Executed", Toast.LENGTH_SHORT).show();
        triggerShowMethod();
    }
};

private void triggerShowMethod(){
    mFragment1.showBtnMethod(false);
};
// Problematic section is below
public void methodB(Boolean in){
    if (in==true){

        FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
        mFragment2 = new Fragment2();
        transaction2.replace(R.id.content_fragment_ID, mFragment2);
        transaction2.commit();
        Toast.makeText(MainActivity.this, "mMethodB Executed", Toast.LENGTH_LONG).show();

    }
};

}

2 个答案:

答案 0 :(得分:0)

您可以简单地将两个界面合并为一个:

public interface Listener{
    public void methodA(Boolean in1);
    public void methodB(Boolean in2);
};

并在您的MainActivity中:

public class MainActivity extends AppCompatActivity implements Fragment1.Listener

答案 1 :(得分:0)

您的活动未实施ListenerB。

public class MainActivity extends AppCompatActivity implements Fragment1.ListenerA, Fragment1.ListenerB {

}