我目前正在阅读有关Java和Android的一些教程,并且刚刚转到数组上。我试图修改我之前制作的应用程序,在代码中使用数组而不是字符串。
我有一个名为FunFactsActivity的主类,并且我声明了一个名为mFunFactsActivity的String数组。然后我将字符串数组加载到mFunFactsActivity中 - 这很好。
然后我在按钮上有一个onClickListener,按下后会从我的FactBook类中获得一个新的事实。我的代码如下:
FunFactsActivity.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);
}
}
我试图实现的是访问我的FactBook.java文件中的mFunFactActivity数组,以使用它来获取随机事实,如下所示:
FactBook.java
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是静态的。
答案 0 :(得分:2)
您无法访问非静态成员,就好像它是静态成员一样。非静态成员链接到对象实例的区别在于,您将为每个新操作符获取不同的成员,而如果将其作为静态成员,则只获得一个。你可以做的是在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()
。您仍然需要有效的上下文
答案 1 :(得分:1)
当你写“FunFactsActivity”时。你指的是类,而不是类的实例。这是一个静态的背景。如果你在点的左侧有一个FunFactsActivity实例,你可以访问它,如下所示:
... = someFunFactsActivity.mFunFactsActivity;
答案 2 :(得分:1)
您需要FunFactsActivity
的实例才能访问实例字段mFunFactsActivity
。您的选择是使该字段为静态(在您的应用程序中只有一个),
public static String[] mFunFactsActivity; // <-- in FunFactsActivity
或者,使用一个实例 - 比如,
public String[] mFunFactsFactBook = new FunFactsActivity().mFunFactsActivity;