При запуске приложения Android происходит сбой, когда я прикрепляю к кнопке onclicklistener

1

Эй, ребята. Я пишу приложение для извлечения последних альбомов 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>

Я бы очень признателен за любую помощь. Благодаря

Теги:
button
android-layout
crash

7 ответов

4

Вы назначаете свой onClickListener кнопке до того, как вы вызываете setContentView, чтобы кнопка была "нулевой" в этой точке, т.е. макет еще не был завышен.

3

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

2
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

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

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

0

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

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

0

Вызовите setContentView(R.layout.search_layout); перед вызовом любого из findViewById.

0

Попробуйте это для вашего onClickListener и Button

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

public void onClick(View v) {
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню