MainActivity中的Switch.setOnCheckedChangeListener而不是Fragment

时间:2016-08-25 08:18:29

标签: java android

如果MainActivity中的Switch已更改,我想查看我的Fragment课程。所以现在我有一个Fragment类和一个Main类(ActivityName)。

我已经尝试将片段中的参考信息提供给我的主要活动类但由于我不知道何时调用它而无法正常工作(它表示总是空引用我猜它&# 39;因为onviewcreated没有被调用,如果我尝试的话。)

我可以在片段中创建Switch.setOnCheckedChangeListener但不能在主类中创建public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); switchA = (Switch) getView().findViewById(R.id.switchA); switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked){ } else{ } } }); 。 (看起来像这样)

unapply

那么最好的选择是将我的Fragment类中的信息提供给我的活动类吗?

我感谢任何建议:)

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:2)

您不应该从活动中触及Fragment的视图。解决问题的最佳方法是创建特殊的界面以提供Fragment和Activity之间的交互,例如:

ChackedChangedCallback.java:

public interface CheckedChangeCallback() {
    void onCheckedChanged(boolean isChecked);
}
片段中的

private CheckedChangeCallback callback = null;

public void onAttach(final Activity activity) {
    super.onAttach(activity);
    if (activity instanceof CheckedChangeCallback) {
        this.callback = (CheckedChangeCallback) activity;
    }
}

public void onDetach() {
    super.onDetach();
    callback = null;
}

public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        switchA = (Switch) getView().findViewById(R.id.switchA);

        switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                callback.onCheckedChange(isChecked);
            }
        });

活动:

public class YourActivity extends AppCompatActivity implements CheckedChangeCallback {

    ...

    @Override
    public void onCheckedChange(boolean isChecked) {
        // do stuff here
    }

}

答案 1 :(得分:1)

快速解决方案是在Main中创建一个处理Switch检查状态的函数。然后在你的片段中,你可以使用getActivity()调用该函数来处理Switch click.functionName() 所以你可以在主要的例子中使用:

@Override
public void configure(HttpSecurity http) throws Exception {
    http
        ...
        .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}

并在片段中:

public void handleSwitchClick(boolean checked) {
   if (checked) {
      // do something
   else {
      // do something else
   }
}

不要反过来,因为你不应该从主要活动中访问片段实例。

如果您需要不断检查Main中交换机的状态,您可以定义一个新成员来说明是否已经检查,以便您进行检查:

public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    switchA = (Switch) getView().findViewById(R.id.switchA);

    switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
              getActivity().handleSwitchClick(isChecked);
        }
    });

答案 2 :(得分:-1)

Activity

static ActivityName activity;
onCreate

Activity方法中的

activity = this;

现在在Activity

中创建一个方法
public static ActivityName getInstance()
{
      return activity;
}

现在在Switch(主要类)中创建用于处理Activity方法的方法

public void handleSwitch(boolean value)
{
       if(value)
       {
          .....
       }
       else
       {
           ......
        }
}

现在在Fragment

public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    switchA = (Switch) getView().findViewById(R.id.switchA);

    switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


            ActivityName.getInstance().handleSwitch(isChecked);


            if(isChecked){

            }
            else{

            }
        }
    });