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

Java 具有公共字符串数组的静态内容中的非静态字段,java,android,arrays,Java,Android,Arrays,我目前正在学习一些关于Java和Android的教程,刚刚开始学习数组。我正在尝试修改我之前创建的应用程序,以便在代码中使用数组而不是字符串 我有一个名为FunFactsActivity的主类,其中我声明了一个名为mFunFactsActivity的字符串数组。然后,我将字符串数组加载到mFunFactsActivity中-这很好 然后,我在按钮上有一个onClickListener,当按下按钮时,将从FactBook类中获得一个新的事实。我的代码如下: FunFactsActivity.jav

我目前正在学习一些关于Java和Android的教程,刚刚开始学习数组。我正在尝试修改我之前创建的应用程序,以便在代码中使用数组而不是字符串

我有一个名为FunFactsActivity的主类,其中我声明了一个名为mFunFactsActivity的字符串数组。然后,我将字符串数组加载到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);
    }
}
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中重复相同的代码。不幸的是,这对我不起作用,因为我遇到了空指针问题。也许我还应该做一些我不知道的事情?不幸的是,这对我不起作用,因为我被赋予了空指针问题。也许我还应该做一些我不知道的事情?