Android studios 如何将上下文从 mainactivity 传递到另一个 class

Android studios how to pass a context from mainactivity to another class

我有这个问题,如何在我的 class Dialog_findname 中使用来自 MainActivity 的函数,我必须在行中传递 main 的上下文:vardadienas = main.loadedfile(MainActivity.this);

public class Dialog_findname extends AppCompatDialogFragment {

  private EditText findName;
  private findnameDialogListener listener;
  private List<VDienas> vardadienas = new ArrayList<>();
  private Finder finder = new Finder();
  private MainActivity main = new MainActivity();


  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {

    vardadienas = main.loadedfile(MainActivity.this);
  }

这是我想在另一个中调用的 MainActivity 函数 class:

public List<VDienas> loadedfile(Context ctxt){
    FileInputStream fis = null;
    try {
        fis = openFileInput(FILE_NAME);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader reader = new BufferedReader(isr);
        String line;
        reader.readLine();

        while ((line = reader.readLine()) != null){
            VDienas VissGads = new VDienas();
            String[] tokens = line.split(";");


            VissGads.setDatums(tokens[0]);
            VissGads.setMenesis(Integer.parseInt(tokens[1]));
            VissGads.setDiena(Integer.parseInt(tokens[2]));

            for (int i = 0; i < Integer.parseInt(tokens[3]); i++) {
                VissGads.setVards(tokens[i + 4]);

            }
            vardadienas.add(VissGads);
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (fis != null){
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return vardadienas;

}

我试图查找类似的问题,但我仍然无法理解如何:(

我想,你必须在你的 MainActivity 上调用这个函数。

vardadienas = main.loadedfile(this);

或勾选MainActivity.class

首先,您不能使用以下内容创建Activity:

private MainActivity main = new MainActivity();

它应该从 Context.startActivity() 开始,您可以在 Activity documentation.

阅读更多相关信息

第二种,你有以下方法:

public List<VDienas> loadedfile(Context ctxt) {
  ...
}

因此,您不能在 Fragment 中使用以下内容调用它:

 vardadienas = main.loadedfile(MainActivity.this);

因为 MainActivity.this 正在引用 MainActivity 的实例,但您的片段不是 activity 的实例。

您需要使用以下方法调用该方法:

 vardadienas = main.loadedfile(getContext());

其中 getContext() 指的是 Activity 附加片段的位置。


您最好将 loadedfile(Context ctxt) 移动到它自己的 class 作为实用程序 class,这样您就可以重用任何其他 class 的方法。你可以做这样的事情:

public class FileUtils {
  private FileUtils() {} // this prevent class being instantiate.

  // we need to make it static so it can be accessed without
  // creating an instance of the class.
  // of course, you can use singleton. But it's another topic
  public static List<VDienas> loadedfile(Context ctxt) {
    ...
  }
}

然后你可以像这样使用这个方法:

vardadienas = FileUtils.loadedfile(getContext());