具有公共字符串数组的静态内容的非静态字段

时间:2014-08-28 19:19:01

标签: java android arrays

我目前正在阅读有关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是静态的。

3 个答案:

答案 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;
相关问题