2011-12-20 3 views
0

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

(As Sqlitefun.java будет дополнительно выполнять I/O и задач обработки данных 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), но все это не работает. (Затмение сказал The constructor AlertDialog.Builder(Sqlitefun) is undefined и не позволили мне составить приведенный выше код не было никакой ошибки и позвольте мне скомпилировать, но есть nullpointer исключение для контекста

ответ

1

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

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

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

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

В SqliteFun, измените метод как таковой:

общественный недействительный getsAlertDialog (String путь_к_файл, контекст 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

Я заменил AlertDialog на Toast как и предложил, но та же проблема существует. Eclipse предположил ошибку «Метод makeText (Context, CharSequence, int) в типе Toast не применим для аргументов (Sqlitefun, String, int) аргументы (Sqlitefun, String, int) – kwytse

+0

Вам по-прежнему нужна контекстная попытка контекст от BrowserFile до Sqlitefun – coder

+0

Возможно ли, что вы можете дать мне пример кода для передачи контекста. Мой обзорный файл предлагается, как указано выше, и вы можете ожидать одну строку для Toast следующим образом: \t статический файл String filepath; \t общественного недействительными getsAlertDialog() { \t \t FilePath = Browsefile.selectpath; \t \t Toast.makeText (Sqlitefun.this, FilePath, тосты. LENGTH_SHORT) .show(); \t \t \t} – kwytse

0

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

private Context context = getApplicationContext() 
+0

Это не сработает, 'Sqlitefun' не распространяется на' Activity'. – Dalmas

+0

Dodu: я перехожу к вашему коду, теперь ошибка: метод getApplicationContext() не определен для типа Sqlitefun – kwytse

+0

LalaRaider: могу ли я спросить, почему это необходимо для продолжения из Activity for Sqlitefun? (Вы можете указать на справочный материал, и я могу прочитать об этом.) – kwytse

0

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

0

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

Static String path; 

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

Ex: Вы получили fullpath="XXXX" в browse.class. Чтобы сохранить переменную fullpath в использовании Sqlitefun.java:

Sqlitefun.path=fullpath; 
0

Существует что-то не так в вашем дизайне приложений.

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

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

Смежные вопросы