2016-03-13 52 views
1

所以我一直在Android Studio中處理這個Android項目,我讓用戶創建待辦事項列表。這是一個班級任務,我必須與單身人士合作。我一直在閱讀大量關於它的信息和問題/答案,但這隻會讓我越來越困惑。在活動中使用Singleton方法(Android)

在我MainActivity我試圖調用該方法ReadTitlesFromFile,但我得到的錯誤:

Modifier 'public' not allowed here

Inner classes cannot have static declarations

即使代碼是完全一樣的,我發現的例子某處。有人可以幫我解決這個錯誤嗎?

這是我的單身:

public class ToDoManagerSingleton { 
private ArrayList<ToDoList> listTitles; 

// One single instance for the entire app 
private static ToDoManagerSingleton ourInstance = new ToDoManagerSingleton(); 

// Constructor 
private ToDoManagerSingleton() { 
    // Empty ArrayList with in it the different lists 
    listTitles = new ArrayList<ToDoList>(); 
} 

// Method to get the one single instance 
public static ToDoManagerSingleton getInstance() { 
    return ourInstance; 
} 

// Getter and setter 
public void setListTitles (ArrayList listTitlesArg){ 
    listTitles = listTitlesArg; 
} 

public ArrayList getListTitles(){ 
    return listTitles; 
} 

// Add new title to list 
public void AddNewTitle(ToDoList title){ 
    listTitles.add(title); 
} 

// Write list titles to a file 
public void WriteListTitlesToFile (Context context){ 
    PrintStream outstream = null; 
    try{ 
     outstream = new PrintStream(context.openFileOutput("titlesfile.txt", Context.MODE_PRIVATE)); 
     for (ToDoList listTitle : listTitles) { 
      outstream.println(listTitle); 
     } 
    } 
    catch (FileNotFoundException e){ 
     e.printStackTrace(); 
    } 
} 

// Read titlesfile.txt 
public void ReadTitlesFromFile(Context context){ 
    try { 
     FileInputStream inStream = context.openFileInput("titlesfile.txt"); 
     InputStreamReader inReader = new InputStreamReader(inStream); 
     BufferedReader bufferedReader = new BufferedReader(inReader); 
     StringBuilder sBuilder = new StringBuilder(); 
     String line; 
     while ((line = bufferedReader.readLine()) != null){ 
      sBuilder.append(line).append("\n"); 
     } 
    } 
    catch (FileNotFoundException e){ 
     e.printStackTrace(); 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 
} 

// Read itemsfile.txt 
public void ReadItemsFromFile(Context context){ 
    try { 
     FileInputStream inStream = context.openFileInput("itemsfile.txt"); 
     InputStreamReader inReader = new InputStreamReader(inStream); 
     BufferedReader bufferedReader = new BufferedReader(inReader); 
     StringBuilder sBuilder = new StringBuilder(); 
     String line; 
     while ((line = bufferedReader.readLine()) != null){ 
      sBuilder.append(line).append("\n"); 
     } 
    } 
    catch (FileNotFoundException e){ 
     e.printStackTrace(); 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 
} 

}

這是MainActivity類:

public class MainActivity extends AppCompatActivity { 

ListView showSavedFilesListview; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Initialize listview 
    showSavedFilesListview = (ListView) findViewById(R.id.ListView1); 

    // Read titles from titlesfile.txt 
    public class ReadTitles { 
     public static void main (Context context) { 
      ToDoManagerSingleton tmp = ToDoManagerSingleton.getInstance(); 
      tmp.ReadTitlesFromFile(Context context); 
     } 
    } 

} 

對不起,如果這是一個愚蠢的問題,或者如果它有之前已經被問過了,但我是編程新手,所有的信息都會讓我困惑。

+0

據我所知,android是一樣的正常的java程序,所以你不能運行與公共靜態void main方法的代碼。這段代碼需要針對android生命週期方法調用,onCreate等運行。 – Simon

+1

在方法中不能有類聲明。在這種情況下,你可以在'onCreate'中聲明一個類('ReadTitles')。只需在'onCreate'方法中獲取單例實例即可。 – TEK

回答

1

您已經在方法中放置了一個類。這就是爲什麼你得到的錯誤:"Modifier 'public' not allowed here"

反正你不需要類ReadTitles;即使您使用它,也可以從main方法中刪除static修飾符。

簡單,而不是這樣的:

// Read titles from titlesfile.txt 
public class ReadTitles { 
    public static void main (Context context) { 
     ToDoManagerSingleton tmp = ToDoManagerSingleton.getInstance(); 
     tmp.ReadTitlesFromFile(Context context); 
    } 
} 

把這個:

// Read titles from titlesfile.txt 
ToDoManagerSingleton tmp = ToDoManagerSingleton.getInstance(); 
tmp.ReadTitlesFromFile(this); // use the Activity context 
+0

啊,是的,這是有道理的!但是,如果我這樣做,我會在「上下文」中得到一個錯誤,因爲我之前沒有使用它.. – marblewhite

+0

@marblewhite自從我上次爲Android編碼以來已經有一段時間了,但我認爲您必須調用方法getApplicationContext()以便獲得對「上下文」的引用。所以你會有'Context context = getApplicationContext()'。然後你可以調用'tmp.ReadTitlesFromFile(context);'。將參數傳遞給方法時,您也不顯式聲明該類型,因爲這是編譯器錯誤。 – TEK

+0

謝謝!我想我明白了! – marblewhite

0

正如前面提到的,你試圖將onCreate方法中聲明一個類ReadTitles類型。你不可以做這個。

相反的:

public class ReadTitles { 
    public static void main (Context context) { 
     ToDoManagerSingleton tmp = ToDoManagerSingleton.getInstance(); 
     tmp.ReadTitlesFromFile(Context context); 
    } 
} 

你可以簡單地內onCreate打電話給你的單身實例。但是,您需要先獲得應用程序Context,然後才能致電ReadTitlesFromFile方法。目前,您正試圖在將參數傳遞給ReadTitlesFromFile時明確聲明類型。你不這樣做,因爲它會導致編譯器錯誤。相反,使用getApplicationContext()方法獲得Context。看到下面:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Initialize listview 
    showSavedFilesListview = (ListView) findViewById(R.id.ListView1); 

    // Read titles from titlesfile.txt 
    ToDoManagerSingleton tmp = ToDoManagerSingleton.getInstance(); 
    Context context = getApplicationContext(); 
    tmp.ReadTitlesFromFile(context); 
} 
+0

感謝您的幫助!應該現在工作。 – marblewhite

+0

@marblewhite請接受一個答案,如果它幫助你。 :) – TEK