使用Interface从Activity转换为Fragment

时间:2015-11-11 16:33:05

标签: java android android-fragments android-activity

我已经搜索过SO以解决这个问题但是找不到任何可以解决我问题的方法。我的问题是,我有一个包含FrameLayout的活动,它不断更新不同的片段。顶视图和底视图将保持相同,因此它们在布局中 活性。

正如您所见,底部视图上有一个按钮,我想在FrameLayout中出现的片段中进行更改。

enter image description here

我创建了一个界面

public interface ShowFormula {

    void showFormula(boolean show);

}

我将用于在片段中实现。 现在我的MainActivity类中的主要问题我正在尝试初始化接口但不能因为我得到类转换异常

showFormula = (ShowFormula) this;//yes i know this is wrong

我应该如何初始化它以便与片段进行通信。 主要目标是在单击活动按钮时切换视图片段。

提前致谢。

6 个答案:

答案 0 :(得分:7)

您不需要使用界面来调用活动到片段。只需保留对当前Fragment的引用,并从Activity中调用Fragment中的公共方法。

如果你有多个片段并且你不想为每个片段保留一个引用,你可以创建一个Fragment基类,在基类中声明公共方法,然后在所有的方法中实现该方法覆盖你的片段继承自基础片段。然后,保留一个基本片段类型的引用,并始终将其设置为当前显示的片段。

答案 1 :(得分:1)

一个干净的解决方案:

`public interface ShowFormula {
   public void showFormula(boolean show);
 }`   

`public class MyActivity implements ShowFormula {
   ...
   @Override
   public void showFormula(boolean show) {
     /** Your Code **/
   }
   ...
 }`

`public class MyFragment {
   private ShowFormula listener;
   ...
   @Override
   public void onAttach(Activity activity) {
     super.onAttach(activity);
     try {
       listener = (ShowFormula) activity;
       // listener.showFormula(show?);
     } catch (ClassCastException castException) {
       /** The activity does not implement the listener. **/
     }
   }
   ...
 }`

答案 2 :(得分:1)

活动--->片段

  

从活动到片段的通信非常简单。您   真的不需要听众。

假设您在片段share()内有一个方法

public class MyFragment extends Fragment{

   public static MyFragment getInstance()
   {
       return new MyFragment();
   }

   ........

   public void share()
   {
        // do something
   }

}

如何从活动中调用share()方法?

  

获取Fragment的引用并调用该方法。简单!

MyFragment myFragment = MyFragment.getInstance();
myFragment.share();

您可以看到Fragment to Fragment Communication的完整工作代码

答案 3 :(得分:1)

只是为了补充Daniel Nugent的出色回答,以下是我的工作代码中的片段,这些片段用于委派从Activity到Fragment的调用。

我具有MVP架构,并且在showError类上定义了错误处理方法BaseView,下面的代码演示了如何在TargetFragment类上处理UI。我特别需要在出现任何错误情况时在片段上隐藏我的进度微调器。这是基类的代码片段:

public interface BaseView {
   void showError(ErrorResponse errorResponse);
}

public abstract class BaseActivity implements BaseView {
   @Override
   public void showError(ErrorResponse errorResponse) {
       // Check error condition or whatever
       // ...
       MaterialDialog dialog = new MaterialDialog.Builder(this)
                .title(R.string.dialog_error_title)
                .content(R.string.error_no_internet)
                .positiveText(R.string.dialog_action_ok)
                .build();
       dialog.show();
   }
}

public abstract class BaseFragment implements BaseView {
   @Override
   public void showError(ErrorResponse errorResponse) {
      ((BaseView) getActivity()).showError(errorResponse);
   }
}

而且,这就是我在TargetFragment类中处理UI的方式:

public final class TargetFragment extends BaseFragment implements TargetView {
   @Override
   public void showError(ErrorResponse errorResponse) {
        super.showError(errorResponse);
        hideSpinner();
        
        // Do other UI stuff
        // ...
   }

   private void hideSpinner() {
       spinner.setVisibility(View.INVISIBLE);
   }
}

答案 4 :(得分:0)

简单的东西将公共方法分段,然后从您的活动中调用它。 例如

MyFragment fragment = new MyFragment(); fragment.doSomeThing();

doSomeThing()是MyFragment中的公共方法。

答案 5 :(得分:-1)

通过接口分割通信的活动:

public class MyActivity {

   private ShowFormula showFormulaListener;

   public interface ShowFormula {
      public void showFormula(boolean show);
  }

  public void setListener(MyFragment myFragment) {
      try {
      showFormulaListener = myFragment;
      } catch(ClassCastException e) {
     }
   }
 }

public class MyFragment implements ShowFormula{

     @Override
     public void onAttach(Activity activity) {
       super.onAttach(activity);
       try {
        ((MyActivity) activity).setDebugListener(this);
        } catch (ClassCastException e) {
        Log.e(TAG, e.toString());
    }
}
     @Override
     public void showFormula(boolean show) {
     /** Your Code **/
     }
}

完成此设置后,您可以调用“ showFormulaListener.showFormula(boolVal)”