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());
我有这个问题,如何在我的 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());