Основная деятельность не ссылается должным образом за пределы класса java

Недавно я столкнулся с проблемой, которая кажется настолько общей и, вероятно, обыденной, что простой поиск в 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>

Проблемы Android Studio часто требуют отображения manifest (а иногда и файла gradle). Не могли бы вы поделиться им? Также иногда проблема заключается в отсутствии import your.package.R.

payne 17.10.2018 21:17

Я не вижу инструкции импорта для FileTools в вашей деятельности. И я тоже не вижу пакет в обоих файлах.

Andrei Vinogradov 17.10.2018 21:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
165
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Во-первых: укажите правильный пакет в каждом файле, соответствующем его расположению.

Во-вторых: добавьте оператор импорта для 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", что и раньше.

RiiNagaja 17.10.2018 21:44

Другие вопросы по теме