2014-08-28 94 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

相關問題