Приложение Android вылетает при запуске всякий раз, когда я присоединяю кнопку onclicklistener к кнопке - PullRequest
1 голос
/ 02 апреля 2011

Привет, ребята. Я пишу приложение для извлечения последних альбомов FM в данный момент и всякий раз, когда я присоединяю onclicklistener к моей кнопке, созданной в search_layout.xml, она вылетает при запуске. Если я закомментирую слушателя, он не падает. Вот код:

public class SearchActivity extends Activity{

//data members
private EditText movieName;
private Button okayBut;
private Button cancelBut;
private URL url;
private InputStream in;
private TextView tv;
private LastFMAlbumHandler lfmah;
private Vector<String> parsedVector;
private String picUrlString;
private URL picUrl;
private SearchActivity search;
private RelativeLayout layout;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //initalize variables below
    movieName = (EditText) findViewById(R.id.entry);        
    okayBut = (Button) findViewById(R.id.ok);
    cancelBut = (Button) findViewById(R.id.cancel);
    layout = (RelativeLayout) findViewById(R.id.layout);
    search = this;



 this.okayBut.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
//      
            try{
//                      url = new URL("http://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026");
//                      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//                      in = conn.getInputStream(); //now  global variable, was bufferedInputStream
//                      try{
//                          lfmah = new LastFMAlbumHandler(tv);
//                          parseToHandler(in, lfmah);
//                          parsedVector = lfmah.getResults();
//                          for(int i = 0; i < parsedVector.size(); i++)
//                          {
//                              picUrlString = parsedVector.get(i);
//                              picUrl = new URL(picUrlString);
//                              imgGet imageGet = new imgGet(layout, picUrl, search);
//                              imageGet.run();
//                          }
//                      }
//                      catch (Exception e){
//                          //fresh.append("couldn't parse");
//                      }
//                      finally{
//                          in.close();
//                      }
//                  }catch(Exception e){
//                      tv.append("could not connect");
//                  } 
            }
     });    
    setContentView(R.layout.search_layout);
}

//ParseToHandler method
private void parseToHandler(InputStream in, CheapHandler handler) throws IOException, ParserConfigurationException, SAXException
{
    try{
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser parser = spf.newSAXParser();
        parser.parse(in, handler);
    }
    catch (IOException e)
    {
        tv.append("first");
    }
    catch(ParserConfigurationException e)
    {
        tv.append("second");
    }
    catch (SAXException e)
    {
        tv.append("third");
    }
    catch (Exception e)
    {
        tv.append("unknown");
    }
}

}

и вот код XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/layout"  xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">

<TextView android:id="@+id/label" android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:text="Enter movie name below:" />

<EditText android:id="@+id/entry" android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:background="@android:drawable/editbox_background"
    android:layout_below="@id/label" />

<Button android:id="@+id/ok" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_below="@id/entry"
    android:layout_alignParentRight="true" android:layout_marginLeft="10dip"
    android:text="OK" />

<Button android:id="@+id/cancel" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_toLeftOf="@id/ok"
    android:layout_alignTop="@id/ok" android:text="Cancel" />
</RelativeLayout>

Я был бы очень признателен за любую помощь. Спасибо

Ответы [ 7 ]

4 голосов
/ 02 апреля 2011

Вы присваиваете свой onClickListener кнопке до того, как вызвали setContentView, так что в этот момент кнопка будет 'нулевой', т. Е. Макет еще не был раздут.

3 голосов
/ 02 апреля 2011

Разве setContentView(R.layout.search_layout); не должен находиться перед кодом, который вызывает findViewById?

2 голосов
/ 29 августа 2013
setContentView(R.layout.search_layout) 

это должно предшествовать вашему

 //initalize variables below 
movieName = (EditText) findViewById(R.id.entry);         
okayBut = (Button) findViewById(R.id.ok); 
cancelBut = (Button) findViewById(R.id.cancel); 
layout = (RelativeLayout) findViewById(R.id.layout); 
search = this; 

Вы должны использовать AsyncTask для выполнения запросов к серверу, поскольку запросы данных не могут быть выполнены в главном потоке пользовательского интерфейса после Android Api Level 10

2 голосов
/ 02 апреля 2011

Переместите вызов на setContentView, чтобы он предшествовал любому из вызовов на findViewById. Пока вы не позвоните setContentView, ни один из этих идентификаторов не будет найден.

Кроме того, подключение к сети является трудоемкой операцией. Вы не должны делать это в обработчике кликов (или в любом месте потока событий). Переместите эту часть кода в отдельный поток и начните использовать onClick(), чтобы запустить поток. См. здесь для получения дополнительной информации.

0 голосов
/ 17 мая 2014

Я обнаружил, что добавление слушателя в onStart исправило null pointer проблемы для меня.

Возможно, просмотры / фрагменты не раздуваются до тех пор, пока не будет завершено onCreate now ...

0 голосов
/ 02 апреля 2011

Вы должны позвонить setContentView(R.layout.search_layout);, прежде чем позвонить любому из findViewById.

0 голосов
/ 02 апреля 2011

Попробуйте это для своих onClickListener и Button

Button button = (Button)findViewById(R.id.btn_configup1);        
button.setOnClickListener(this);

public void onClick(View v) {
}
...