首页 > 解决方案 > 不是通过意图或捆绑而是通过android中的接口将数据从主活动发送到片段?

问题描述

我的问题很简单,如何通过接口而不是通过 android 中的意图或捆绑将数据从主要活动发送到片段。请指导我谢谢。

这是我从片段到通过接口发送的 Activity 数据的代码,但我想反对它 Activity 到片段,我不知道该怎么做。

public interface OnRestaurantSelectedListener {
    public void onRestaurantSelected(String s);
}



  MainActivity extends AppCompatActivity implements OnRestaurantSelectedListener{
    String mPosition;
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

}
     @Override
        public void onRestaurantSelected(String s) {
            mPosition =s;

        }

    }

在片段中:

public class ListFragment extends Fragment {
    ...

    private OnRestaurantSelectedListener mOnRestaurantSelectedListener;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            mOnRestaurantSelectedListener = (OnRestaurantSelectedListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + e.getMessage());
        }
    }

mOnRestaurantSelectedListener.onRestaurantSelected("AliResturant");


}

标签: android-fragmentsandroid-activityinterface

解决方案


创建接口FragmentCommunicator为,

public interface FragmentCommunicator{
   public void passDataToFragment(String someValue);
}

在您的主活动中,我们可以使用接口并将数据传递给片段。如下图,

public class MainActivity extends FragmentActivity{
        //interface through which communication is made to fragment
        public FragmentCommunicator fragmentCommunicator;
        private Button fragmentButton;

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                setContentView(R.layout.title_viewpager);
                fragmentButton = (Button)findViewById(R.id.fragmentButton);
                setUIListeners();
        }

        private void setUIListeners(){
                fragmentButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
              if(fragmentCommunicator != null)
                fragmentCommunicator.passDataToFragment("Hi from FragmentActivity");
            }
        });

       }
}

访问片段中传递的数据,如下所示,

public class CustomFragment extends Fragments implements FragmentCommunicator{
      public Context context;
      private Button activityButton;
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
            View fragmentView = inflater.inflate(R.layout.activity_frag, container, false);
             activityButton =(Button)fragmentView.findViewById(R.id.activityButton);
             textView =(TextView)fragmentView.findViewById(R.id.textView);
             setRetainInstance(true);
             return fragmentView;
    }

  //FragmentCommunicator interface implementation
  @Override
  public void passDataToFragment(String someValue){
   String activityAssignedValue = someValue;
   textView.setText(activityAssignedValue); 
  }
}

推荐阅读