15 votes

Comment obtenir l'événement onClickListener() sur une barre d'action personnalisée ?

Je suis en train de développer une application dans laquelle je dois obtenir onClick() sur le clic de la vue personnalisée de la barre d'action. Jusqu'à présent, je suis en mesure de réaliser la mise en page suivante.

Custom Action Bar

Voici mon code pour y parvenir :

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

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    getActionBar().setCustomView(R.layout.custom_image_button);
    getActionBar().setDisplayOptions(
            ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:
        Toast.makeText(getApplicationContext(), "Clicked on ActionBar",
                Toast.LENGTH_SHORT).show();

    default:
        return super.onOptionsItemSelected(item);
    }
}

Voici la mise en page de mon bouton personnalisé_image_button :

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

<FrameLayout
    android:id="@+id/frame_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true" >

    <TextView
        android:id="@+id/points"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginRight="10dp"
        android:layout_marginTop="5dp"
        android:background="@drawable/points_yellow"
        android:gravity="center"
        android:paddingLeft="20dp"
        android:textColor="#887141"
        android:textIsSelectable="false"
        android:textSize="22sp"
        android:textStyle="bold" >
    </TextView>

    <ImageView
        android:id="@+id/badge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|right"
        android:layout_marginRight="5dp"
        android:layout_marginTop="0dp"
        android:src="@drawable/badge_notification" >
    </ImageView>
</FrameLayout>

</RelativeLayout>

J'essayais d'avoir un écouteur de clics sur la mise en page personnalisée. Pour cela, j'ai essayé le code suivant :

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

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    getActionBar().setCustomView(R.layout.custom_image_button);
    getActionBar().setDisplayOptions(
            ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM);

    final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View v = inflater.inflate(R.layout.custom_image_button, null);

    frameLayout = (FrameLayout) v.findViewById(R.id.frame_layout);

    frameLayout.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Toast.makeText(getApplicationContext(), "Clicked on 1",
                    Toast.LENGTH_SHORT).show();
            return false;
        }
    });
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:
        Toast.makeText(getApplicationContext(), "Clicked on ActionBar",
                Toast.LENGTH_SHORT).show();

    default:
        return super.onOptionsItemSelected(item);
    }
}

}

Mais, je suis incapable d'obtenir onClick() sur l'image personnalisée. Qu'est-ce que je fais de mal ici, s'il vous plaît guidez.

Toute forme d'aide sera appréciée.

20voto

Dhawal Sodha Parmar Points 5627

Après dans Inflater c'est juste comme la vue dans le fichier de mise en page

donc, vous devez ajouter android:onClick="clickEvent" sur ActionBar fichier de mise en page personnalisé

enter image description here

Voici la démo :

mon activité principale :

package com.example.testdemo;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.Toast;

public class MainActivity extends Activity {

    private View viewList;
    private Dialog dialogMarketList;
    String a[] = { "a", "aa" };
    private View header;

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

        ActionBar actionBar = getActionBar();
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(false);
        actionBar.setDisplayShowCustomEnabled(true);
        View cView = getLayoutInflater().inflate(R.layout.header, null);
        actionBar.setCustomView(cView);

    }

    @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;
    }

    public void clickEvent(View v) {
        if (v.getId() == R.id.button1) {
            Toast.makeText(MainActivity.this, "you click on button1",
                    Toast.LENGTH_SHORT).show();
        }

        if (v.getId() == R.id.button2) {
            Toast.makeText(MainActivity.this, "you click on button2",
                    Toast.LENGTH_SHORT).show();
        }

        if (v.getId() == R.id.textView1) {
            Toast.makeText(MainActivity.this, "you click on textView1",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

ma mise en page header.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="horizontal"
    android:weightSum="3" >

    <Button
        android:id="@+id/button1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="clickEvent"
        android:text="Button 1" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="clickEvent"
        android:gravity="center"
        android:textColor="#FFFFFF"
        android:text="My action bar"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="clickEvent"
        android:text="Button 2" />

</LinearLayout>

6voto

Pulkit Kumar Points 101
    View cView = getLayoutInflater().inflate(R.layout.header, null);
    cView.findViewById(R.id.btn_id).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
                         // Do stuff here.
        }
    });
    actionBar.setCustomView(cView);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X