Quiero aprender de

http://developer.android.com/reference/android/widget/Button.html

que «en lugar de la aplicación de un OnClickListener para el botón en su actividad, puede asignar un método para su botón en el XML de diseño, utilizando el android:atributo onClick.»

Sin embargo, sólo puedo hacerlo con el XML enfoque, mi Escucha de enfoque, especificada por la siguiente, conduce a un bloqueo de la aplicación.

En mi fragment_main.xml:

<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.myapp.MainActivity$PlaceholderFragment" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <Button
        android:id="@+id/try_button" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text = "TryButton"
        android:onClick="onClick"
    />
</RelativeLayout>

En mi activity_main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.myapp.MainActivity"
    tools:ignore="MergeRootFrame">
</FrameLayout>

Y en mi MainActivity.java:

public class MainActivity extends Activity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
Button button = (Button)findViewById(R.id.try_button);      
button.setOnClickListener(this);
}
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "I'm clicked!", Toast.LENGTH_SHORT).show();;
}
@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 {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}

}

El LogCat dice:

05-20 19:56:17.604: E/MoreInfoHPW_ViewGroup(566): Parent view is not a TextView
05-20 19:56:17.649: D/AndroidRuntime(566): Shutting down VM
05-20 19:56:17.649: W/dalvikvm(566): threadid=1: thread exiting with uncaught exception (group=0x4194ec08)
05-20 19:56:17.654: E/AndroidRuntime(566): FATAL EXCEPTION: main
05-20 19:56:17.654: E/AndroidRuntime(566): Process: com.example.myapp, PID: 566
05-20 19:56:17.654: E/AndroidRuntime(566): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/com.example.myapp.MainActivity}: java.lang.NullPointerException
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.app.ActivityThread.access$900(ActivityThread.java:169)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.os.Handler.dispatchMessage(Handler.java:102)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.os.Looper.loop(Looper.java:136)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.app.ActivityThread.main(ActivityThread.java:5476)
05-20 19:56:17.654: E/AndroidRuntime(566):  at java.lang.reflect.Method.invokeNative(Native Method)
05-20 19:56:17.654: E/AndroidRuntime(566):  at java.lang.reflect.Method.invoke(Method.java:515)
05-20 19:56:17.654: E/AndroidRuntime(566):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
05-20 19:56:17.654: E/AndroidRuntime(566):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
05-20 19:56:17.654: E/AndroidRuntime(566):  at dalvik.system.NativeStart.main(Native Method)
05-20 19:56:17.654: E/AndroidRuntime(566): Caused by: java.lang.NullPointerException
05-20 19:56:17.654: E/AndroidRuntime(566):  at com.example.myapp.MainActivity.onCreate(MainActivity.java:29)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.app.Activity.performCreate(Activity.java:5473)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
05-20 19:56:17.654: E/AndroidRuntime(566):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
05-20 19:56:17.654: E/AndroidRuntime(566):  ... 11 more

Estoy usando el último Eclipse ADT v22.6.2 en Windows 7, que se ejecuta en Samsung Galaxy Note 10.1 2014.

Lo que está mal con mi código?

  • Parece que su button variable es null
  • Usted dice que el botón se define en fragment_main, pero nunca se establece esta disposición. Usted está estableciendo activity_main.
  • Entonces, ¿cómo hacerlo bien?
  • es correcto. También se están utilizando Fragmento (PlaceholderFragment)?
  • Sí, yo estoy usando Fragmento, pero ¿cómo puedo establecer oyente de mi botón dentro de fragment_main? No quiero que el botón en activity_main.
  • Tenemos que hacer un montón de limpieza en el código. Por favor, puedes compartir tanto xmls (fragment_main, activity_main), MainActivity(archivo completo) y PlaceholderFragment?
  • He añadido la visión completa de los archivos que usted ha mencionado, favor de ayudarme a encontrar el camino de salida, gracias

InformationsquelleAutor Bamqf | 2014-05-21

5 Comentarios

  1. 6

    Intente esto:

    public class MainActivity extends Activity  {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
    getFragmentManager().beginTransaction()
    .add(R.id.container, new PlaceholderFragment()).commit();
    }
    //Button button = (Button)findViewById(R.id.try_button);      
    //button.setOnClickListener(this);
    }
    /**
    public void onClick(View v) {
    }
    */
    @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 {
    public PlaceholderFragment() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container,
    false);
    Button button = (Button) rootView.findViewById(R.id.try_button);      
    button.setOnClickListener(this);
    return rootView;
    }
    @Override
    public void onClick(View v) {
    //TODO Auto-generated method stub
    Toast.makeText(getActivity(), "I'm clicked!", Toast.LENGTH_SHORT).show();
    }
    }
    }
    • Funciona! Gracias!
  2. 0

    Usted no necesita implementar OnClickListener, porque el botón de ejecutar el método automáticamente.

    Edición:

    public class MainActivity extends Activity {
    private OnClickListener onClickListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
    getFragmentManager().beginTransaction()
    .add(R.id.container, new PlaceholderFragment()).commit();
    }
    initListener();//Initializing Listener.
    Button button = (Button)findViewById(R.id.try_button);
    //This command causes problem
    button.setOnClickListener(onClickListener);
    }
    private void initListener(){
    onclickListener = new OnClickListener() {
    @Override
    public void onClick(View view) {
    Toast.makeText(getApplicationContext(),
    "Button Clicked",Toast.LENGTH_SHORT).show();
    }
    };
    }

    Salir de la Onclick en el XML.

    <Button
    android:id="@+id/try_button" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text = "TryButton"
    />
    • Que sería el xml solo enfoque, yo sé que funciona. Pero tengo que aprender la Escucha de enfoque.
    • He puesto un ejemplo sobre cómo se trabaja con los Oyentes.
    • Gracias por tu respuesta, pero he intentado y conseguido similares de registro de bloqueo(con y sin el onClick de atributo xml). He editado mi post con el contenido completo de los archivos de mi, tal vez sería de gran ayuda.
  3. 0

    He explicado las diferentes maneras en que usted puede implementar un OnClickListener en mi blog:
    http://www.androiddevresources.com/guides/tutorial-how-to-implement-an-onclicklistener/

    Básicamente hay tres formas.
    – Implementar el oyente en la clase de actividad (y establezca el atributo xml)
    – Crear una variable en la clase de actividad (o de otra clase, por ejemplo un fragmento).
    – Crear una nueva escucha en línea con new OnClickListener().

    He añadido el código de ejemplo en el artículo y un proyecto de ejemplo en GitHub que se puede descargar.

  4. 0

    público de inicio de la clase se extiende la Actividad implementa la Vista.OnClickListener {
    Botón man;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);
    bSMS = (Button) findViewById(R.id.button);
    bSMS.setOnClickListener(this);
    }
    @Override
    public void onClick(View arg0) {
    //TODO Auto-generated method stub
    switch (arg0.getId()) {
    case R.id.button:        //"Block SMSs" button pressed
    startActivity(new Intent(this,secret_main.class));
    break;
    }
    }

    }

    • Usted podría hacer esto mejor respuesta explicando cómo funciona.
  5. 0

    XML : android:onClick="onclickid"

    Actividad :

    public void onclickid(View view)
    {
    //Do something When the button is click
    }

    Esto Debería Ayudar, Pero yo sugiero utilizar onclicklistener

Dejar respuesta

Please enter your comment!
Please enter your name here