我在片段中有一个复选框,我希望它在点击按钮时响应此按钮在我的主要活动中?

时间:2017-03-24 10:02:43

标签: android android-fragments android-checkbox

我只是第一次使用片段,我的主要活动中有一个片段内的复选框和一个提交按钮。我想要做的是当我按下提交按钮时我想要一个消息,是否选中了复选框项目?

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private Spinner Dspinner;
    private Button Subbtn;

    ArrayAdapter adapter;

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

        Subbtn = (Button)findViewById(R.id.button);

        adapter = ArrayAdapter.createFromResource(this, R.array.spinner_options, android.R.layout.simple_spinner_item);

        spinnerListner();
    }

    public void spinnerListner(){
        Dspinner = (Spinner)findViewById(R.id.spinner);
        Dspinner.setAdapter(adapter);
        Dspinner.setOnItemSelectedListener(
                new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        switch (position){
                            case 0:
                                getSupportFragmentManager().beginTransaction().replace(R.id.frag, BlankFragment.newInstance()).addToBackStack(null).commit();
                                break;
                            case 1:
                                getSupportFragmentManager().beginTransaction().replace(R.id.frag, BlankFragment2.newInstance()).addToBackStack(null).commit();
                                break;
                        }
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {

                    }
                }
        );
    }
}

BlankFragment.java

public class BlankFragment extends Fragment {

    public BlankFragment(){

    }

   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

    public static Fragment newInstance() {
        BlankFragment fragment = new BlankFragment();
        return fragment;
    }
}

BlankFragment2.java

public class BlankFragment2 extends Fragment {

    public BlankFragment2(){

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank_2, container, false);
    }

    public static Fragment newInstance() {
        BlankFragment2 fragment = new BlankFragment2();
        return fragment;
    }
}

enter image description here

enter image description here

6 个答案:

答案 0 :(得分:2)

您可以使用界面与MainActivity进行通信。

  
      
  1. 创建一个界面并在MainActivity上实现它。
  2.   
  3. 将已实现的接口传递给片段并将其存储在片段
  4. 中   
  5. 然后当您的复选框状态更改时检查存储的接口是否为null,如果不为null,则调用实现的方法   接口,实际上是在MainActivity中实现的。
  6.   
  7. 这样您就可以与MainActivity进行通信。在MainActivity中,存储您的复选框状态,并按下按钮执行您想要执行的操作。
  8.   

<强>接口

public interface OnStateChanged {

public void onChange(int state);
}

在MainActivity上实现它,如

MainActivity implements OnStateChanged {

  @Override
public void onChange(int state){
  // store your data here     
 }

为Fragment中的 OnStateChanged 接口和功能创建一个将通过接口的变量

在片段中:

OnStateChanged mListener;
public void setOnStateChangeListener(OnStateChanged listener){
  mLinstener = listener;
}

当复选框状态改变时调用接口函数

在片段中:

//...if state change...
if(mListener!= null) {
   mListener.onChange(/*your value*/);
}

将MainActivity中实现的接口实例传递给片段

在MainActivity中:

fragment.setOnStateChangeListener(this);

答案 1 :(得分:2)

有几种方法可以实现此功能。最简单的方法是在Activity中定义一个接口,让Fragment实现它。(或者你可以单独定义一个接口,让Activity实现它,它是类似的解决方案)

对于更多解决方案,您可以使用Google&#34;片段和活动互动&#34;。

我只能提供一些零碎的代码,因为我找不到具体的变量名称。 首先,在Activity中定义一个接口,如下所示:

public static class MainActivity extends AppCompatActivity{  
    ...  

    //Container Activity must implement this interface  
    public interface CheckBoxStateCallback{  
        public Boolean getTheState();  
    }  

    ...  

其次,让你的片段实现它:

public class BlankFragment extends Fragment implements CheckBoxStateCallback{

    public BlankFragment(){

    }

    @Override
    public Boolean getTheState(){
        //return your checkbox state
    } 

    ...

最后,您需要在Activity中的Button上添加一个点击监听器:

...

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Boolean b = BlankFragment.newInstance().getTheState();
        //then you can make a toast
    }
});

...

答案 2 :(得分:0)

在MainActivity中,您将实现我们使用方法CheckboxStatusObserver定义的接口checkBoxChanged

public class MainActivity extends AppCompatActivity implements CheckboxStatusObserver{

// other methods
void checkBoxChanged(boolean checkedStatus){
   Toast.makeText(getContext(), "status " + checkedStatus, Toast.LENGTH_LONG).show();
}

public interface CheckboxStatusObserver{
    void checkBoxChanged(boolean checkedStatus);
}
}

在Fragment中,我们将获得CheckboxStatusObserver作为父Activity的引用。然后在膨胀Fragment的内容时,我们可以设置一个监听器来检测复选框的on更改。然后我们会调用observer.checkBoxChanged(checkedStatus);并将复选框的已检查状态传递给它。

public class BlankFragment extends Fragment {

private CheckboxStatusObserver observer;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    observer = (CheckboxStatusObserver) getActivity();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_blank, container, false);

    // Find the checkbox instace using view.findViewById();

    // Setup change listener on checkbox instance and notify the observer
    {
        observer.checkBoxChanged(checkedStatus);
    }

    return view;
}   
}

每当复选框状态发生变化时,都会调用MainActivity中的方法。

有关详细信息,请参阅以下链接:
https://stackoverflow.com/a/25392549/592025

https://developer.android.com/training/basics/fragments/communicating.html

  

要允许Fragment与其Activity进行通信,您可以在Fragment类中定义接口并在Activity中实现它。 Fragment在其onAttach()生命周期方法中捕获接口实现,然后可以调用Interface方法以与Activity通信。

答案 3 :(得分:0)

  

MainActivity中创建一个界面,然后单击下面的监听器

 try {
     ((OnClick) this).onSubmitClicked();
     } catch (ClassCastException cce) {
       cce.printStackTrace();
     }

public interface OnClick {
        public void onSubmitClicked();
    }
  

现在在Fragment中实现侦听器,这样您就可以获得onSubmitClicked实现的方法,如下所示!

    public class BlankFragment extends Fragment implements MainActivity.OnClick{

      @Override
      public void onSubmitClicked() {
        //do something here
      }
    }

答案 4 :(得分:0)

您可以使用Otto事件总线库或Guava EventBus库来实现此目的。它还可以帮助您使应用程序更加模块化。

让我们使用Otto eventbus库来回答您的问题。 我们有以下方案来涵盖 1.在MainActivity中,您有一个SUBMIT按钮 2.在片段A中,您有一个复选框 3.每当您单击“提交”按钮时,您需要一条带有文本的Toast消息,指出是否选中了复选框。

按照以下步骤获得解决方案。

  1. 将gradle添加到您的项目中

    compile 'com.squareup:otto:1.3.8'

  2. 在项目中创建一个Events类,并创建一个事件,以便在单击SUBMIT按钮时发布。例如,您的Events类将包含以下代码。

    public class Events { public static class SubmitEvent { public SubmitEvent() {} } }

  3. 在项目中创建一个GlobalBus类,以便您可以在整个应用程序中访问相同的总线。将下面的代码写入其中。

    public class GlobalBus { private static Bus sBus; public static Bus getBus(){ if (sBus == null) sBus = new Bus(); return sBus; } }

  4. 单击SUBMIT按钮时,使用otto eventbus库发布SubmitEvent事件。

    Subbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GlobalBus.getBus().post(new Events.SubmitEvent()); } });

  5. 在片段A中,您编写代码以订阅otto事件总线,如下所示。

    GlobalBus.getBus().register(this);

  6. 在Fragment A中,然后编写一个订阅方法来订阅事件(即SubmitEvent),这样无论何时从MainActivity发布此事件,您都会收到通知并显示正确的消息(即复选框是否为检查与否)。您可以编写订阅方法,如下所示。

    @Subscribe public void showMessage(Events.SubmitEvent events) { /// check here whether checkbox is checked or not.. /// Based on that show proper message }

  7. 注意:如果您想了解有关otto事件总线库的更多信息,可以查看https://tutorialwing.com/otto-event-bus-tutorial-example/

答案 5 :(得分:0)

这是另一种方式,与我当天评论可能满足您的需求的方式不同

在主要活动中

switch (position){
                            case 0:
                                position=0;
getSupportFragmentManager().beginTransaction().replace(R.id.frag, fragment1).addToBackStack(null).commit();
                                break;
                            case 1:
                                position=1;
getSupportFragmentManager().beginTransaction().replace(R.id.frag, fragment2).addToBackStack(null).commit();
                                break;
                        }
                    }

在spite的OnitemClick中

public class Blank1Fragment extends Fragment {


....
    public  void function(){
        //check which checkbox selected and toast;
    }


}





public class Blank2Fragment extends Fragment {


....
    public  void function(){
        //check which checkbox selected and toast;
    }

}

每个片段都有

{{1}}