Android 调用另一个.java文件中的alertdialog
我有一个activity/java文件(Browsefile.java),它将获取文件的绝对路径。我想将此信息传递给另一个java文件进行进一步处理(Sqlitefun.java)。在第一阶段,我只想确保file path的变量从Browsefile.java传递到Sqlitefun.java,所以我只需要在Sqlitefun.java文件中创建一个alertdialog来测试它。但是,我对alertdialog对象的上下文有一些问题 (由于Sqlitefun.java将进一步执行i/o和Sqlite处理任务,因此我更愿意将其放在另一个文件中。) 以下是文件的代码: Browsefile.javaAndroid 调用另一个.java文件中的alertdialog,android,variables,this,android-alertdialog,android-context,Android,Variables,This,Android Alertdialog,Android Context,我有一个activity/java文件(Browsefile.java),它将获取文件的绝对路径。我想将此信息传递给另一个java文件进行进一步处理(Sqlitefun.java)。在第一阶段,我只想确保file path的变量从Browsefile.java传递到Sqlitefun.java,所以我只需要在Sqlitefun.java文件中创建一个alertdialog来测试它。但是,我对alertdialog对象的上下文有一些问题 (由于Sqlitefun.java将进一步执行i/o和Sql
public class Browsefile extends ListActivity {
....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.browsefile);
findViews();
getDir(root);
}
....
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
File file = new File(path.get(position));
if (file.isDirectory())
{
if(file.canRead())
{
getDir(path.get(position));
}
else
{
selectpath = file.getAbsolutePath();
fpath.setText(selectpath);
}
}
else
{
selectpath = file.getAbsolutePath();
fpath.setText(selectpath);
}
}
private Button.OnClickListener importcsv = new Button.OnClickListener() {
public void onClick(View v) {
Sqlitefun firstClass = new Sqlitefun();
firstClass.getsAlertDialog(selectpath);
}
};
....
}
public class Sqlitefun {
private Context context;
public void getsAlertDialog(String filepath) {
new AlertDialog.Builder(context)
.setMessage(filepath)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
.show();
}
}
Sqlitefun.java
public class Browsefile extends ListActivity {
....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.browsefile);
findViews();
getDir(root);
}
....
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
File file = new File(path.get(position));
if (file.isDirectory())
{
if(file.canRead())
{
getDir(path.get(position));
}
else
{
selectpath = file.getAbsolutePath();
fpath.setText(selectpath);
}
}
else
{
selectpath = file.getAbsolutePath();
fpath.setText(selectpath);
}
}
private Button.OnClickListener importcsv = new Button.OnClickListener() {
public void onClick(View v) {
Sqlitefun firstClass = new Sqlitefun();
firstClass.getsAlertDialog(selectpath);
}
};
....
}
public class Sqlitefun {
private Context context;
public void getsAlertDialog(String filepath) {
new AlertDialog.Builder(context)
.setMessage(filepath)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
.show();
}
}
我曾尝试使用this
,Sqlitefun.this
替换行newAlertDialog.Builder(context)
中的context
,但均无效。(Eclipse说,构造函数AlertDialog.Builder(Sqlitefun)未定义,不允许我编译。上面的代码没有任何错误,允许我编译,但上下文存在空指针
异常。尝试以下操作:
private Context context = getApplicationContext()
您需要为执行此方法的活动提供contex。因此,我建议您向Sqlitefun类添加构造函数,并在创建此类对象时向参数添加上下文。我认为您需要显示当前活动中的对话框,因此您需要将AlertDialog代码放入BrowserFile中
我不确定这是否有效,但您可以尝试将上下文从BrowserFile传递到SqliteFun并在那里显示
此外,如果您没有设置使用AlertDialog,请尝试改用Toast通知。通常在活动之外使用时效果更好
编辑:我不认为下面的方法是实现您正在尝试做的事情的最佳方法,但下面是我编写的一个代码示例
在SqliteFun中,修改方法如下:
public void getsAlertDialog(字符串文件路径,上下文mContext){
然后在活动中,使用以下方法:
private Button.OnClickListener importcsv = new Button.OnClickListener() {
public void onClick(View v) {
Sqlitefun firstClass = new Sqlitefun();
firstClass.getsAlertDialog(selectpath, v.getContext());
}
};
首先在Sqlitefun.java中创建一个静态变量
Static String path;
之后,您可以从任何类访问该变量,以便直接从Browse.class存储该路径
例如:您在browse.class中获得了fullpath=“XXXX”
。要在Sqlitefun.java中存储fullpath
变量,请使用:
Sqlitefun.path=fullpath;
你的应用程序设计有问题
除了活动类之外,您无法真正显示来自其他类的对话框(当然,您可以,但这非常危险,因为活动上下文随时都可能更改。例如,当设备旋转时,您的应用程序将因活动上下文更改而崩溃,因为在Sqlitefun
中,您的引用仍然指向旧上下文)
因此,您应该找到另一种显示对话框的方法。例如,您可以创建一些getter来检索要在AlertDialog
上显示的值,并在活动中创建它。Dodu:我更改为您的代码,错误现在是:方法getApplicationContext()类型sqlitefunlalaaider未定义:我可以问一下为什么必须从活动扩展到Sqlitefun吗?(您可以指向参考资料,我可以阅读。)正如LalaRaider所说,我没有看到Sqlitefun不是从activity扩展而来的。关于什么是上下文的解释可以在这里找到:感谢Dodu和LalaRaider。我的意图是将变量从一个文件/java类传递到另一个文件/java类。如果是这样,我不会使用alertdialog来测试变量是否被传递。我已经替换了AlertDialog提示Toast与u相同,但存在相同的问题。Eclipse提示错误“Toast类型中的方法makeText(Context,CharSequence,int)不适用于参数(Sqlitefun,String,int)参数(Sqlitefun,String,int)您仍然需要一个上下文-尝试将上下文从BrowserFile传递到SqliteFun是否可以在传递上下文时给我一些示例代码。我的Browsefile建议如上所述,您可以预期Toast的一行内容如下:静态字符串filepath;public void getsAlertDialog(){filepath=Browsefile.selectpath;Toast.makeText(Sqlitefun.this,filepath,Toast.LENGTH_SHORT).show()}太棒了!上面的代码很有效。我会对上下文做更多的研究。我会接受你的答案。再次感谢。