-1

У меня проблема с btn.setOnClickListener(this). У меня есть простой проект, который работает хорошо, но когда я добавить действие к кнопке я получаю сообщение:setOnClickListener (это) сбой моего приложения

unfortunatelay (app name) has stopped 

Когда я комментирую btn.setOnClickListener(this) из проекта работает без каких-либо проблем.

Вот мой код:

package com.example.hello; 

import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.ActionBarActivity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class MainActivity extends ActionBarActivity { 


    public static final Context PlaceholderFragment = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 



     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container, new PlaceholderFragment()).commit(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class PlaceholderFragment extends Fragment implements OnClickListener { 
     Button btn; 
     public PlaceholderFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, 
        false); 
      btn=(Button)rootView.findViewById(R.id.Entrer); 
      btn.setOnClickListener(this); 
      return rootView; 
     } 

     @Override 
     public void onClick(View v) { 
      // here is the problem error: no eclosing istance of the type MainActivityis accessible in scope 
      Intent intent = new Intent(MainActivity.this, SecondActivity.class); 
      startActivity(intent); 

     } 
    } 
} 

Моя раскладка выглядит следующим образом:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.hello.MainActivity$PlaceholderFragment" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="300dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="190dp" 
     android:text="@string/hello_world" 
     android:textSize="16dp" /> 

    <Button 
     android:id="@+id/Entrer" 
     android:layout_width="300dp" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/textView1" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="61dp" 
     android:text="Entrer" /> 

</RelativeLayout> 

Я не знаю, если у меня есть простые вещи, которые не идут правильно. Я новичок в программировании Android. Спасибо!

ответ

2

btnnull, поэтому, когда вы установили onClickListener, вы получаете NullPointerException. Это null, потому что он находится в fragment_main.xml, а не activity_main.xml. Вы должны переместить этот код из onCreate()

btn = (Button) findViewById(R.id.Entrer); 
btn.setOnClickListener(this); 

в PlaceholderFragment() следующим образом:

public static class PlaceholderFragment extends Fragment { 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, 
       false); 
     btn=(Button) rootView.findViewById(R.id.Entrer); 
     btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(getActivity(), SecondActivity.class); 
      startActivity(intent); 
     } 
     }); 
     return rootView; 
    } 
} 
0
btn=(Button)findViewById(R.id.Entrer); 
btn.setOnClickListener(this); 

Скорее всего, findViewById выше возвращает null. btn.setOnClickListener сбой при исключении нулевого указателя. (Потому что btn равно null).

Очень вероятно, поскольку вы используете структуру фрагментов по умолчанию, созданную решением Eclipse, что кнопка действительно находится в файле макета фрагмента (fragment_main.xml), а не в файле activity_main.xml. (Следовательно, кнопка не находится в представлении Activity, она находится в виде фрагмента).

Если это так, то переместите эти две строки в метод onCreateView объекта PlaceholderFragment.

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