2014-08-28 68 views
0

我目前正在浏览一些关于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); 
    } 
} 

什么,然后我想实现的是访问我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; 
    } 
} 

第i我正在与该行:

public String[] mFunFactsFactBook = FunFactsActivity.mFunFactsActivity; 

我被告知我无法从静态内容引用非静态字段。我对'静态'的知识目前还不是很好,而且我100%确定自己了解它,但是从我所知道的情况来看,我所写的代码中没有一个说明mFunFactsActivity是静态的。

回答

1

当您编写“FunFactsActivity”。你指的是类而不是类的一个实例。这是一个静态的上下文。您可以访问它,如果你点的左侧有FunFactsActivity的实例,就像这样:

... = someFunFactsActivity.mFunFactsActivity; 
1

您需要的FunFactsActivity实例访问实例字段mFunFactsActivity。您的选择是让现场静(只有一个在你的应用程序),

public static String[] mFunFactsActivity; // <-- in FunFactsActivity 

或者,使用实例 - 有点像,

public String[] mFunFactsFactBook = new FunFactsActivity().mFunFactsActivity; 
+0

不幸的是,这并没有为我工作,因为我被给予nullPointer问题。也许有一些额外的东西我应该做,我不知道? – K20GH 2014-08-28 22:29:26

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; 
} 

}

,并呼吁mFactBook.initFacts()里面的onCreate()。你仍然需要一个有效的上下文

+0

谢谢,这对我来说,使用mFactBook.initFacts(getApplicationContext());但我唯一的问题是,我不在FunFactsActivity和FactBook中重复相同的代码 – K20GH 2014-08-28 22:28:36

相关问题