Недавно я столкнулся с проблемой, которая кажется настолько общей и, вероятно, обыденной, что простой поиск в Google действительно дает ответы на все виды связанных вопросов, но не на саму проблему.
У меня очень простая установка, в которой мое единственное и, следовательно, основное действие пытается ссылаться на другой Java-класс, который я создал, чтобы запустить две простые функции чтения из файла и записи в файл.
Моя основная деятельность:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class DatenActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_daten);
if (!FileTools.readString(this, HELLO_FILENAME, PROPERTY_DIRECTORY).equals("")) {
TextView output = (TextView) findViewById(R.id.textview_ausgabe);
output.setText(FileTools.readString(this, HELLO_FILENAME, PROPERTY_DIRECTORY));
}
}
private final static String HELLO_FILENAME = "helloString.txt";
private final static String PROPERTY_DIRECTORY = "properties";
public void onButtonSpeichernClick(View view){
TextView output = (TextView)findViewById(R.id.textview_ausgabe);
TextView input = (TextView)findViewById(R.id.edittext_eingabe);
output.setText(input.getText());
FileTools.saveString(this, HELLO_FILENAME, PROPERTY_DIRECTORY, output.getText().toString());
}
}
А вот вырезанный пример ссылочный класс:
import android.content.Context;
import android.util.Log;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import static android.content.Context.MODE_PRIVATE;
public class FileTools {
private FileTools() {}
public static String readString(Context context, String fileName){
String result = "";
try {
FileInputStream in = context.openFileInput(fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String zeile;
while((zeile = reader.readLine()) != null)
result += zeile;
reader.close();
} catch (IOException ex){
Log.e(context.getClass().getSimpleName(), ex.toString());
}
return result;
}
-""- etc. for one more methods, and then a variant for each of them with alternative file directory name.
}
Теперь проблема в том, что Android Studio показывает мне ссылку "FileTools" красными буквами, сообщая мне, что это "не удается разрешить символ" FileTools "", что делает все методы внутри класса недоступными для меня.
Это не проблема самих методов, потому что они работали до того, как я перенес их в их собственный класс, и теперь они также явно общедоступны и статичны. Кроме того, даже с общедоступным конструктором для FileTools.class Android Studio все еще не может его найти, поэтому проблема явно возникнет в будущем.
Я уже пробовал стандартные 4 вещи, которые вы обычно делаете с подобными вещами: очистка, восстановление, синхронизация с Gradle и Invalidate Cache+Restart - все не сработало. Из-за несвязанной проблемы со сбоем во время обновлений мне даже пришлось полностью переустановить Android Studio и Sdk, но все равно.
Может быть, я упускаю из виду какую-то действительно простую вещь? Я этого не вижу ..
Между прочим, при попытке импортировать FileTools (... не то, чтобы это было необходимо, но отчаяние ...), всплывающая подсказка вместо этого говорит "класс FileTools находится в пакете по умолчанию", так что делает распознает его существование по крайней мере.
//Редактировать: Запрошенный manifest.xml:
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "android.and05.lektion1.daten">
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:roundIcon = "@mipmap/ic_launcher_round"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".DatenActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Я не вижу инструкции импорта для FileTools в вашей деятельности. И я тоже не вижу пакет в обоих файлах.




Во-первых: укажите правильный пакет в каждом файле, соответствующем его расположению.
Во-вторых: добавьте оператор импорта для FileTools внутри класса активности.
Похоже, вам нужно добавить свой класс FileTools в пакет. Просто добавьте его в пакет, как показано ниже, затем импортируйте этот пакет в «основная деятельность»:
package mypackageFileTools;
imports....
public class FileTools {...}
Источник документа Java: https://docs.oracle.com/javase/specs/jls/se6/html/packages.html
It is a compile time error to import a type from the unnamed package.
Спасибо, что ответили. Действительно, объявление пакета в FileTools было вырезано. (Я знал, что это должно быть что-то маленькое ...) Однако ручная вставка нужного, перестройка и повторная синхронизация не сработали, поэтому мне пришлось удалить и создать класс заново. Теперь он работает, хотя в нем есть тот же пакет "android.and05.lektion1.daten", что и раньше.
Проблемы Android Studio часто требуют отображения
manifest(а иногда и файлаgradle). Не могли бы вы поделиться им? Также иногда проблема заключается в отсутствииimport your.package.R.