簡體   English   中英

在活動中使用單例方法 (Android)

[英]Using Singleton methods in activities (Android)

所以我一直在 Android Studio 中處理這個 android 項目,我讓用戶創建待辦事項列表。 這是一個課堂作業,我必須與單身人士一起工作。 我已經閱讀了很多關於它的信息和問題/答案,但這只會讓我越來越困惑。

在我的MainActivity我嘗試調用ReadTitlesFromFile方法,但出現錯誤:

此處不允許使用修飾符“public”

內部類不能有靜態聲明

即使代碼與我在某處找到的示例完全相同。 有人可以幫我修復錯誤嗎?

這是我的單身人士:

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

}

如果這是一個愚蠢的問題,或者之前已經被問過,我很抱歉,但我是編程新手,所有的信息都讓我感到困惑。

您已在方法中放置了一個類。 這就是為什么您會收到錯誤消息: "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

如前所述,您試圖在onCreate方法中聲明一個ReadTitles類型的類。 你不可以做這個。

代替:

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

您可以簡單地在onCreate調用您的 Singletons 實例。 但是,您需要先獲取應用程序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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM