Android 无法从外部类更改片段变量的值

Android 无法从外部类更改片段变量的值,android,variables,fragment,Android,Variables,Fragment,我正在使用片段,但我无法从外部类访问其变量 目前,我有一个片段片段视图,其中有一个设置按钮。无论何时按下,它都会显示一个UI元素来定义不同的设置。我复制我拥有的代码: 片段 public static Boolean show = false; private void initSettingsPanel() { m_settingsBtn = (ImageButton) m_activity.findViewById(R.id.settingButton); /* c

我正在使用
片段
,但我无法从外部类访问其变量

目前,我有一个片段
片段视图
,其中有一个设置
按钮
。无论何时按下,它都会显示一个UI元素来定义不同的设置。我复制我拥有的代码:

片段

 public static Boolean show = false;


 private void initSettingsPanel() {
    m_settingsBtn = (ImageButton) m_activity.findViewById(R.id.settingButton);

    /* click settings panel button to open or close setting panel. */
    m_settingsBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            m_settingsLayout = (LinearLayout) m_activity.findViewById(R.id.settingsPanelLayout);
            if (m_settingsLayout.getVisibility() == View.GONE) {
                m_settingsLayout.setVisibility(View.VISIBLE);
                if (m_settingsPanel == null) {
                    m_settingsPanel = new SettingsPanel(m_activity, show); //HERE I CALL THE EXTERNAL CLASS
                }
            } else {
                m_settingsLayout.setVisibility(View.GONE);
            }
        }
    });

}
m_settingsPanel.showVar.getShow()
设置spanel

    private Activity m_activity;
    private static Boolean p_show;
    private Switch p_switch;


    public SettingsPanel(Activity activity, Boolean show
) {
      p_show = show;
      m_activity = activity;
      initUIElements(); // Init switch
}

    private void initUIElements() {

      p_switch = (Switch) m_activity.findViewById(R.id.showSwitch);
      setUIListeners();
}

    private void setUIListeners() {

      p_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            p_show = isChecked;
        }
    });
  }
  }
public class SettingsPanel {
public ShowVar showVar = new ShowVar() {
        @Override
        public void set_Show(Boolean show) {
            super.setShow(show);
        }

    };
}

当前发生的情况是,当我激活开关时,我更改了
Pannel
的th VARIABLE值,但它不会影响片段。为什么?是否有其他方法可以更改其变量的值而不发送到
SettingPanel
每个变量?这至少是一种正确的方法吗?

最后,我创建了一个
抽象类
,以便
获取
设置
变量:

ShowVar

public abstract class ShowVar {
  static private Boolean show = false;
  public Boolean getShow() {
    return show;
  } 

  public void setShow(Boolean value) {
    this.show = value;
  } 
}
从我的
SettingPanel
中,我让instance
ShowVar
每次设置变量的新值,并更改
开关

设置spanel

    private Activity m_activity;
    private static Boolean p_show;
    private Switch p_switch;


    public SettingsPanel(Activity activity, Boolean show
) {
      p_show = show;
      m_activity = activity;
      initUIElements(); // Init switch
}

    private void initUIElements() {

      p_switch = (Switch) m_activity.findViewById(R.id.showSwitch);
      setUIListeners();
}

    private void setUIListeners() {

      p_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            p_show = isChecked;
        }
    });
  }
  }
public class SettingsPanel {
public ShowVar showVar = new ShowVar() {
        @Override
        public void set_Show(Boolean show) {
            super.setShow(show);
        }

    };
}
从我的片段中,我可以使用变量
m_settingsPanel

片段

 public static Boolean show = false;


 private void initSettingsPanel() {
    m_settingsBtn = (ImageButton) m_activity.findViewById(R.id.settingButton);

    /* click settings panel button to open or close setting panel. */
    m_settingsBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            m_settingsLayout = (LinearLayout) m_activity.findViewById(R.id.settingsPanelLayout);
            if (m_settingsLayout.getVisibility() == View.GONE) {
                m_settingsLayout.setVisibility(View.VISIBLE);
                if (m_settingsPanel == null) {
                    m_settingsPanel = new SettingsPanel(m_activity, show); //HERE I CALL THE EXTERNAL CLASS
                }
            } else {
                m_settingsLayout.setVisibility(View.GONE);
            }
        }
    });

}
m_settingsPanel.showVar.getShow()

您可以在活动和片段之间注册接口-

在你的活动课上-

public YourActity extends AppCompactActivity implements CallbackInterface {

//your interface instance
private CallbackInterface mCallbackInterface;

@Override
void performSomething() {
 // Write your code here.
}
}
}

在片段中,您可以覆盖

奥纳塔克()

注册到接口--


瞧!现在,您可以使用此接口将任何数据发送回您的活动。

我认为您需要使用此接口将settingsPanel中的值发送回您的片段。我目前正在将此面板用于其他变量(myVar.method()),它们可以工作。但是,当我试图简单地改变布尔值时,它没有改变。我假设p_show是该变量的一个新实例,因此即使我更改了它的值,原始变量也不会受到影响。我说的对吗?嘿@Mario,你可以在你的活动和片段之间注册一个接口。您可以将任何数据传回活动。不确定,为什么你需要一个抽象类?我最终使用抽象类的原因是因为我的类并不完全是发布的类,而是更复杂的类。此外,我需要相同类型的各种实现共享一个共同的行为,因此需要一个抽象类。