Вызвать alerttdialog в другом файле .java - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть один файл активности / java (Browsefile.java), который бы получил абсолютный путь к файлу. Я хочу передать эту информацию в другой файл Java для дальнейшей обработки (Sqlitefun.java). На первом этапе я просто хочу убедиться, что переменная пути к файлу передается из Browsefile.java в Sqlitefun.java, поэтому я просто создаю alerttdialog в файле Sqlitefun.java для его проверки. Тем не менее, у меня есть некоторые проблемы в контексте объекта alerttdialog.

(Так как Sqlitefun.java будет дополнительно выполнять задачи обработки ввода-вывода и Sqlite, я предпочитаю поместить это в другой файл.)

Вот коды для файлов:

Browsefile.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); 
    }
};
....
}

Sqlitefun.java

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 для замены context в строке AlertDialog.Builder(context), но ничего из этого не работает. (Eclipse сказал The constructor AlertDialog.Builder(Sqlitefun) is undefined и не позволил мне скомпилировать. Приведенный выше код не содержал никаких ошибок и позволил мне скомпилировать, но есть исключение nullpointer для Context.

Ответы [ 5 ]

1 голос
/ 20 декабря 2011

Я считаю, что вам нужно показывать диалоги из Активности, в которой вы сейчас находитесь, поэтому вам нужно будет поместить код AlertDialog в BrowserFile.

Я не уверен, что это сработает, но вы можете попробовать передать контекст из BrowserFile в SqliteFun и показать его там.

Кроме того, если вы не настроены на использование AlertDialog, попробуйте вместо этого использовать уведомление Toast.Обычно они работают лучше, когда используются вне Activity.

Edit: я не думаю, что следующее - лучший способ реализовать то, что вы пытаетесь сделать, но вот пример кода, который я написал

В SqliteFun измените ваш метод следующим образом:

public void getsAlertDialog (String filepath, Context mContext) {

new AlertDialog.Builder(mContext)
.setMessage(filepath)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub
    }
})
.show();
} 

Затем из вашей деятельности используйтеэто:

private Button.OnClickListener importcsv = new Button.OnClickListener() {
public void onClick(View v) {
    Sqlitefun firstClass = new Sqlitefun();
        firstClass.getsAlertDialog(selectpath, v.getContext()); 
}
};
0 голосов
/ 20 декабря 2011

Что-то не так в дизайне вашего приложения.

Вы не можете действительно показать диалог из другого класса, кроме класса деятельности (ну, вы можете , но это очень опасно, потому что действиеконтекст может измениться в любое время. Например, когда устройство поворачивается, ваше приложение падает, потому что контекст активности изменился, поскольку в Sqlitefun ваша ссылка все еще указывает на старый контекст).

Так что вы должны найти другой способпоказать свой диалог.Например, вы можете создать несколько методов получения, чтобы получить значения, отображаемые в вашем AlertDialog, и создать их внутри своей деятельности.

0 голосов
/ 20 декабря 2011

Сначала создайте статическую переменную в Sqlitefun.java.

Static String path;

После этого вы можете получить доступ к этой переменной из любого класса, чтобы вы могли напрямую сохранить этот путь из Browse.class

Пример: Вы получили fullpath="XXXX" в файле browse.class. Для хранения переменной fullpath в Sqlitefun.java используйте:

Sqlitefun.path=fullpath;
0 голосов
/ 20 декабря 2011

Вам нужно дать контекст от активности, которую вы выполняете этим методом.Поэтому я предлагаю вам добавить конструктор в класс Sqlitefun и при создании объекта этого класса добавить контекст к аргументам.

0 голосов
/ 20 декабря 2011

Попробуйте это:

private Context context = getApplicationContext()
...