dans mon programme, j'utilise un gridview avec certaines images, je veux afficher un menu lorsque l'utilisateur appuie sur une image dans gridview, puis sélectionnez une action à faire dans le menu affiché.
voici mes codes:
package Kazemi.Alireza.scada;
import Android.annotation.SuppressLint;
import Android.app.Dialog;
import Android.app.FragmentManager;
import Android.content.Context;
import Android.graphics.Typeface;
import Android.graphics.drawable.AnimationDrawable;
import Android.os.Bundle;
import Android.support.v4.app.Fragment;
import Android.view.ContextMenu;
import Android.view.ContextMenu.ContextMenuInfo;
import Android.view.Gravity;
import Android.view.LayoutInflater;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.ViewGroup;
import Android.view.WindowManager;
import Android.view.ViewGroup.LayoutParams;
import Android.widget.AdapterView;
import Android.widget.AdapterView.AdapterContextMenuInfo;
import Android.widget.BaseAdapter;
import Android.widget.Button;
import Android.widget.GridView;
import Android.widget.ImageView;
import Android.widget.LinearLayout;
import Android.widget.PopupWindow;
import Android.widget.TextView;
import Android.widget.Toast;
import Android.widget.AdapterView.OnItemClickListener;
@SuppressLint("NewApi")
public class CitiesTab extends Fragment {
AnimationDrawable[] frameAnimation;
ImageAdapter ia;
GridView gridView;
int in;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return (LinearLayout)inflater.inflate(R.layout.citytab, container, false);
}
public void onStart()
{
super.onStart();
ia = new ImageAdapter(getActivity());
gridView = (GridView) getActivity().findViewById(R.id.gridview);
gridView.setAdapter(ia);
gridView.post(new Starter());
gridView.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
dialog = new Dialog(getActivity(), Android.R.style.Theme_InputMethod);
dialog.setContentView(R.layout.pump_menu);
}});
/*Button btn = (Button) getActivity().findViewById(R.id.Button_pumpInfo);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getActivity(), "You clicked on Item 1",
Toast.LENGTH_LONG).show();
}
});*/
}
public void Btn_pumpInfo_Clicked(View v) {
// TODO Auto-generated method stub
Toast.makeText(getActivity(), "You clicked on Item 1",
Toast.LENGTH_LONG).show();
}
}
voici mon code pump_menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="#a5c5f0"
Android:orientation="vertical" >
<Button
Android:id="@+id/Button_pumpInfo"
Android:layout_height="40dp"
Android:text="@string/menu_pumpinfo_item1"
Android:textSize="11sp"
Android:layout_width="125dp"
Android:background="#a5c5f0"
Android:onClick="Btn_pumpInfo_Clicked"/>
et citytab.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<GridView
Android:id="@+id/gridview"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:numColumns="auto_fit"
Android:verticalSpacing="10dp"
Android:horizontalSpacing="10dp"
Android:columnWidth="90dp"
Android:stretchMode="columnWidth"
Android:gravity="center" />
<ImageView
Android:id="@+id/gifViewer"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:scaleType="center"/>
</LinearLayout>
quand j'utilise ce code, une erreur est survenue:
Java.lang.RuntimeException: Unable to start activity ComponentInfo{Kazemi.Alireza.scada/Kazemi.Alireza.scada.MainMenu}: Java.lang.NullPointerException
et quand je commente la méthode Btn_pumpInfo_Clicked (), et commente l'écouteur de bouton dans onStart (), l'erreur suivante se produit:
Java.lang.IllegalStateException: Could not find a method Btn_pumpInfo_Clicked(View) in the activity class Android.view.ContextThemeWrapper for onClick handler on view class Android.widget.Button with id 'Button_pumpInfo'
où est le problème? Merci
Vous ne pouvez pas enregistrer le rappel onClick
(à l'aide de Android:onClick
) pour Button
(à partir de la présentation de Dialog
) dans la classe Fragment
car Android ne le trouvera pas car il recherchera seulement le Activity
pour une méthode (Btn_pumpInfo_Clicked
) et il lève cette exception. Recherchez plutôt la Button
dans la Dialog
et affectez-lui un écouteur normal:
//...
dialog.setContentView(R.layout.pump_menu)
Button b = (Button) dialog.findViewById(R.id.Button_pumpInfo);
b.setOnClickListener(new OnClickListener() {
@Override
public void onCLick(View v) {
// profit
}
});
Ou déplacez la méthode:
public void Btn_pumpInfo_Clicked(View v) {
// TODO Auto-generated method stub
Toast.makeText(getActivity(), "You clicked on Item 1",
Toast.LENGTH_LONG).show();
}
dans la classe Activity
si cela vous convient.
Si ce bogue ne se produit que sur Android 2.x vérifiez la hiérarchie de votre classe d'activité pour les membres de classe spécifiques à Android 4:
public class HomeActivity extends Activity {
private Android.app.ActionBar.LayoutParams customTitleParams;
....
}
La classe Android.app.ActionBar.LayoutParams
n'est pas disponible sur Android 2.x et cela peut causer le problème.
Cela peut également se produire lorsque la méthode d'appel sur onClick de la vue (bouton) n'est pas accessible ou n'est pas disponible dans l'activité correspondante .