У меня проблема с созданием объекта другого класса во фрагменте. Мой код

public View onCreateView(LayoutInflater layoutinflater,
        ViewGroup viewgroup, Bundle bundle) {
    TextView tv = (TextView) getActivity().findViewById(R.id.textView3);
    (/*ERROR LINE*/)Database info = new Database(this);
    info.open();
    String data = info.getData();
    info.close();
    tv.setText(data);
    return layoutinflater.inflate(R.layout.sqlview, viewgroup, false);
}

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

0
vishalmullur 7 Мар 2014 в 00:56
У вас также может быть ошибка в следующей строке: (TextView) getActivity().findViewById(R.id.textView3);. это текстовое представление находится на sqlview?
 – 
Shayan Pourvatan
7 Мар 2014 в 01:00
Да. у меня там нет ошибки
 – 
vishalmullur
7 Мар 2014 в 01:03

3 ответа

Лучший ответ

Используйте ответ Мерлеведе на свой вопрос, но после запуска этого приложения вы должны получить ошибку NullPointerException :

tv.setText(data);

Потому что tv это null

TextView tv = (TextView) getActivity().findViewById(R.id.textView3);

textView3 находится на sqlview. поэтому вы должны изменить свой код следующим кодом:

public View onCreateView(LayoutInflater layoutinflater,
        ViewGroup viewgroup, Bundle bundle) {
    View v = layoutinflater.inflate(R.layout.sqlview, viewgroup, false);
    TextView tv = (TextView) v.findViewById(R.id.textView3);
    Database info = new Database(getActivity());
    info.open();
    String data = info.getData();
    info.close();
    tv.setText(data);
    return v;
}
1
Shayan Pourvatan 7 Мар 2014 в 01:12
В точку!! Я не совсем понял, почему тв не работает.
 – 
vishalmullur
7 Мар 2014 в 01:17
1
Вы помещаете textView3 в sqlview, но хотите получить доступ к этому с помощью метода getActivity(), getActivity возвращает макет вашей активности, который является другим макетом, вам нужен этот макет для доступа к textView3, поэтому вам нужно сначала объявить свое представление и использовать v.findViewById()
 – 
Shayan Pourvatan
7 Мар 2014 в 01:19
Я не знаю, где именно вы можете это прочитать, но когда вы надуваете другой макет и хотите работать с виджетом на этом макете, вы должны делать так, например, в пользовательском адаптере и во многих других местах, я надеюсь, вы меня поняли
 – 
Shayan Pourvatan
7 Мар 2014 в 01:25

Попробуй использовать

Database info = new Database(getActivity());

getActivity() возвращает действие, связанное с фрагментом, и, поскольку Activity наследуется от Context, вы можете использовать его в качестве параметра для вашего конструктора.

1
Merlevede 7 Мар 2014 в 00:59
Спасибо. попробую и расскажу
 – 
vishalmullur
7 Мар 2014 в 01:04
Это дает мне NPE
 – 
vishalmullur
7 Мар 2014 в 01:14

Вам нужно добавить конструктор в Database.java

class Database extends SQLiteOpenHelper{

    public Database(Context context) {
        super(context, "Your Database Name", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // write you create table query here.
    }


    // other method to get data...



}

Это решит проблему с конструктором.

0
Sachin Shelke 7 Мар 2014 в 01:07