Java 具有公共字符串数组的静态内容中的非静态字段
我目前正在学习一些关于Java和Android的教程,刚刚开始学习数组。我正在尝试修改我之前创建的应用程序,以便在代码中使用数组而不是字符串 我有一个名为FunFactsActivity的主类,其中我声明了一个名为mFunFactsActivity的字符串数组。然后,我将字符串数组加载到mFunFactsActivity中-这很好 然后,我在按钮上有一个onClickListener,当按下按钮时,将从FactBook类中获得一个新的事实。我的代码如下: FunFactsActivity.javaJava 具有公共字符串数组的静态内容中的非静态字段,java,android,arrays,Java,Android,Arrays,我目前正在学习一些关于Java和Android的教程,刚刚开始学习数组。我正在尝试修改我之前创建的应用程序,以便在代码中使用数组而不是字符串 我有一个名为FunFactsActivity的主类,其中我声明了一个名为mFunFactsActivity的字符串数组。然后,我将字符串数组加载到mFunFactsActivity中-这很好 然后,我在按钮上有一个onClickListener,当按下按钮时,将从FactBook类中获得一个新的事实。我的代码如下: FunFactsActivity.jav
public class FunFactsActivity extends Activity {
private FactBook mFactBook = new FactBook();
public String[] mFunFactsActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fun_facts);
Resources resources = getResources();
mFunFactsActivity = resources.getStringArray(R.array.funFacts);
final TextView factLabel = (TextView) findViewById(R.id.factTextView);
final Button showFactButton = (Button) findViewById(R.id.showFactButton);
final RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
String fact = mFactBook.getFact();
factLabel.setText(fact);
int color = mColorWheel.getColor();
relativeLayout.setBackgroundColor(color);
showFactButton.setTextColor(color);
}
};
showFactButton.setOnClickListener(listener);
}
}
public class FactBook {
public String[] mFunFactsFactBook = FunFactsActivity.mFunFactsActivity;
public String getFact() {
String fact = "";
Random randomGenerator = new Random(); //Construct a new Random number generator
int randomNumber = randomGenerator.nextInt(mFunFactsFactBook.length);
fact = mFunFactsFactBook[randomNumber];
return fact;
}
}
然后,我试图实现的是访问FactBook.java文件中的mFunFactActivity数组,使用它获取随机事实,如下所示:
FactBook.java
public class FunFactsActivity extends Activity {
private FactBook mFactBook = new FactBook();
public String[] mFunFactsActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fun_facts);
Resources resources = getResources();
mFunFactsActivity = resources.getStringArray(R.array.funFacts);
final TextView factLabel = (TextView) findViewById(R.id.factTextView);
final Button showFactButton = (Button) findViewById(R.id.showFactButton);
final RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
String fact = mFactBook.getFact();
factLabel.setText(fact);
int color = mColorWheel.getColor();
relativeLayout.setBackgroundColor(color);
showFactButton.setTextColor(color);
}
};
showFactButton.setOnClickListener(listener);
}
}
public class FactBook {
public String[] mFunFactsFactBook = FunFactsActivity.mFunFactsActivity;
public String getFact() {
String fact = "";
Random randomGenerator = new Random(); //Construct a new Random number generator
int randomNumber = randomGenerator.nextInt(mFunFactsFactBook.length);
fact = mFunFactsFactBook[randomNumber];
return fact;
}
}
我遇到的问题是线路:
public String[] mFunFactsFactBook = FunFactsActivity.mFunFactsActivity;
我被告知不能从静态内容引用非静态字段。我对“静态”的了解目前还不多,我100%确信我理解它,但是从我所能看出,我所写的代码中没有一个说明mFunFactsActivity是静态的。当你写“FunFactsActivity”时,你指的是类,而不是类的实例。这是一个静态上下文。如果在点的左侧有FunFactsActivity实例,则可以访问它,如下所示:
... = someFunFactsActivity.mFunFactsActivity;
当您编写“FunFactsActivity”时,您指的是类,而不是类的实例。这是一个静态上下文。如果在点的左侧有FunFactsActivity实例,则可以访问它,如下所示:
... = someFunFactsActivity.mFunFactsActivity;
您需要一个
FunFactsActivity
的实例来访问实例字段mFunFactsActivity
。您的选择是使字段静态(应用程序中只有一个)
您需要一个
FunFactsActivity
的实例来访问实例字段mFunFactsActivity
。您的选择是使字段静态(应用程序中只有一个)
不能像访问静态成员一样访问非静态成员。不同之处在于,非静态成员链接到对象实例,因此每个新操作符将获得不同的成员,而如果将其设置为静态,则只会获得一个。您可以做的是在FactBook中创建方法来初始化事实数组。例如:
public class FactBook {
public String[] mFunFactsFactBook = null;
public void initFacts(Context context) {
if (mFunFactsFactBook == null) {
Resources resources = context.getResources();
mFunFactsFactBook = resources.getStringArray(R.array.funFacts);
}
}
public String getFact() {
String fact = "";
Random randomGenerator = new Random(); //Construct a new Random number generator
int randomNumber = randomGenerator.nextInt(mFunFactsFactBook.length);
fact = mFunFactsFactBook[randomNumber];
return fact;
}
}
并在onCreate()内部调用
mFactBook.initFacts()。您仍然需要有效的上下文您不能像访问静态成员一样访问非静态成员。不同之处在于,非静态成员链接到对象实例,因此每个新操作符将获得不同的成员,而如果将其设置为静态,则只会获得一个。您可以做的是在FactBook中创建方法来初始化事实数组。例如:
public class FactBook {
public String[] mFunFactsFactBook = null;
public void initFacts(Context context) {
if (mFunFactsFactBook == null) {
Resources resources = context.getResources();
mFunFactsFactBook = resources.getStringArray(R.array.funFacts);
}
}
public String getFact() {
String fact = "";
Random randomGenerator = new Random(); //Construct a new Random number generator
int randomNumber = randomGenerator.nextInt(mFunFactsFactBook.length);
fact = mFunFactsFactBook[randomNumber];
return fact;
}
}
并在onCreate()内部调用mFactBook.initFacts()。您仍然需要一个有效的上下文谢谢,这对我很有用,使用mFactBook.initFacts(getApplicationContext());然而,我唯一的问题是,我没有在FunFactsActivity和FactBook中重复相同的代码。谢谢,这对我来说很有效,使用mFactBook.initFacts(getApplicationContext());然而,我唯一的问题是,我没有在FunFactsActivity和FactBook中重复相同的代码。不幸的是,这对我不起作用,因为我遇到了空指针问题。也许我还应该做一些我不知道的事情?不幸的是,这对我不起作用,因为我被赋予了空指针问题。也许我还应该做一些我不知道的事情?