我完全忽略了我认为简单的Java语法。
以下是我的第一堂课的例子:
public ExampleClass {
public boolean exampleBool = false;
if(SomethingImportantHappensOnRuntime) {
exampleBool = true;
}
}
这是第二堂课:
public ExampleClass2 {
if(exampleBool) {
//do stuff
}
}
如何将ExampleBool从ExampleClass传递给ExampleClass2 ,以便在运行时重要事件发生时,exampleBool将设置为true并且“ExampleClass2”中的“if”将会运行?
答案 0 :(得分:6)
最简单的方法是:
public ExampleClass {
public static boolean exampleBool = false;
public static boolean returnExampleBool () {
return exampleBool;
}
if(SomethingImportantHappensOnRuntime) {
exampleBool = true;
}
}
public ExampleClass2 {
if(ExampleClass.ReturnExampleBool()) {
//do stuff
}
}
答案 1 :(得分:1)
从问题中不清楚你是否只想从另一个类中读取一个成员变量,或者你是否希望第二个类在第一个类中设置标志时作出反应。
对于你只需要访问,成员变量,使成员变量私有,否则它可以被任何东西修改,然后提供一个访问器来读取它的值:
public ExampleClass {
private boolean exampleBool = false;
public boolean getExampleBool() {
return exampleBool;
}
void someMethodOrOther() {
if(somethingImportantHappensOnRuntime()) {
exampleBool = true;
}
}
}
如果您希望ExampleBlass2在exampleBool更改时做出反应,那么它会更复杂。这是一种名为observer pattern的设计模式,它是这种情况的转换解决方案。
这涉及在两个类之间添加一个接口,允许第二个类听第一个类,而不是第一个类具有第二个类的特定知识。
interface ExampleClassObserver {
public void exampleClassChanged(ExampleClass exampleClass);
}
public final class ExampleClass {
private final List<ExampleClassObserver> observers = new ArrayList<ExampleClassObserver>();
private boolean exampleBool = false;
public boolean getExampleBool() {
return exampleBool;
}
public final void addObserver(ExampleClassObserver observer) {
observers.add(observer);
}
public final void removeObserver(ExampleClassObserver observer) {
observers.remove(observer);
}
void someMethodOrOther() {
if(somethingImportantHappensOnRuntime()) {
exampleBool = true;
notifyObservers();
}
}
private void notifyObservers() {
for (ExampleClassObserver observer : observers) {
observer.exampleClassChanged(this);
}
}
}
public final class ExampleClass2 implements ExampleClassObserver {
public ExampleClass2(ExampleClass exampleClass) {
// we need to start observing the class so we're notified when the change happens
exampleClass.addObserver(this);
}
public void exampleClassChanged(ExampleClass exampleClass) {
if (exampleClass.getExampleBool()) {
// do something
}
}
}
所以这里发生的事情是,当设置布尔标志时,任何观察者都会收到有关更改的通知,当通知ExampleClass2时,它会检查标志并执行它所需的操作。
答案 2 :(得分:0)
我会在ExampleClass中有一个ExampleClass2的实例。 ExampleClass2应该有一个像setBoolean(boolean b)这样的方法来更新对象中的字段。当偶数发生时,您可以在ExampleClass2中调用此setter方法。
答案 3 :(得分:0)
我想感谢Raza的简单回答并与我分享,是一个带有监听器(SetOnItemSelectedListener)的Spinner的改编版。在保存之前,或者如果微调器处于正确的位置等,这可以用于验证使用微调器完成的某些操作,等等:
首先,设置两个基础类,Raza很高兴为我们提供:
public static boolean myBoolean = false;
public static boolean ClassForRetruningBoolean() {
return myBoolean;
}
其次,我必须设置微调器侦听器:
spinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position == 0) {
myBoolean = false;
}
else if (position != 0) {
myBoolean = true;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
//Semicolons and parenthesis make crying faces
}
}
);
第三,你必须为你的其他课程提供该课程。我用AndroidAnnotations做这件事。此外,我在活动文件中。
@Bean
TheClassWhereTheBooleanIs getingTheClassForTheBoolean;
之后,为Button设置onClickListener,并检索写入布尔值的类:
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*Validation for empty CNC text area*/
else if (getingTheClassForTheBoolean.ClassForRetruningBoolean() == true /*you could also add another condition here && etc*/) {
Toast toast = Toast.makeText(getApplicationContext(), "Boolean is True therefore no saving", Toast.LENGTH_LONG);
toast.show();
}
/*Every validation has being pass now you can move on*/
else {
//So if the validation pass you can do the intent, the boolean is false
Intent i = new Intent(getApplicationContext(), OtherActivity.class);
startActivity(i);
}
}
});
希望你们发现它很有用