【问题标题】:Android studios how to pass a context from mainactivity to another classAndroid工作室如何将上下文从mainactivity传递给另一个类
【发布时间】:2018-10-15 18:16:20
【问题描述】:

我有这个问题,如何在我的类 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 函数:

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;

}

我试图查找类似的问题,但我仍然不明白如何:(

【问题讨论】:

    标签: java android-studio main-activity


    【解决方案1】:

    首先,您不能使用以下内容创建 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 的实例,但您的片段不是活动的实例。

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

     vardadienas = main.loadedfile(getContext());
    

    getContext() 指的是 Fragment 附加的 Activity。


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

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

    【讨论】:

    • 谢谢,现在我明白了,我也犯了一个错误:我没有将上下文传递给 openFileInput。所以正确的方式 context.openFileInput
    【解决方案2】:

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

    vardadienas = main.loadedfile(this);
    

    或检查 MainActivity.class

    【讨论】:

    • 如果你通过this 那么你会得到错误:MainActivity 中的加载文件(...)不能应用于(com.example.firstapp.firstapp.Dialog_findname)。我认为错误来自于创建: private MainActivity main = new MainActivity();在非活动课中
    • 你试过 private MainActivity main = new MainActivity();主类
    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多