2017-08-23 3 views
1

Salut développeur android, j'apprends la base de données android sql et ayant un problème. J'ai créé ce code, la construction est terminée mais quand je lance l'émulateur, le bouton est non cliquable.
J'ai essayé de créer un toast pour m'assurer que le bouton est cliquable mais ça ne fonctionne pas non plus, je me demande ce qui ne va pas avec le code? besoin d'aide svp merciandroid sqlite bouton unclickable

package com.faddi.sql; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.database.Cursor; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemLongClickListener; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast; 
import com.faddi.model.DataHelper; 

public class MainActivity extends AppCompatActivity implements OnClickListener, OnItemLongClickListener{ 

ListView listView; 
SimpleCursorAdapter adapter; 
@SuppressWarnings("deprecation") 

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

    listView = (ListView) findViewById(R.id.listView1); 
    listView. setOnItemLongClickListener(this); 
    findViewById(R.id.tambahButton).setOnClickListener(this); 
    findViewById(R.id.refreshButton).setOnClickListener(this); 


    DataHelper dh = new DataHelper(this); 
    Cursor c = dh.getAll(); 
    String[] from = new String[] { "judul","isi" }; 
    int[] to = new int[] { android.R.id.text1, android.R.id.text2 }; 
    try{ 
     adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, c, from, to); 
    }catch (Exception ex){} 
    listView.setAdapter(adapter); 

} 

protected void onResume() { 
    adapter.notifyDataSetChanged(); 
    super.onResume(); 
} 

public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.tambahButton: 
      Toast.makeText(getBaseContext(),"testing",Toast.LENGTH_SHORT).show(); 
      //startActivity(new Intent(this,SecondActivity.class)); 
      break; 
     case R.id.refreshButton: 
      DataHelper dh = new DataHelper(this); 
      Cursor c = dh.getAll(); 
      String[] from = new String[] { "judul","isi" }; 
      int[] to = new int[] { android.R.id.text1, android.R.id.text2 }; 
      try{ 
       adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, c, from, to); 
      }catch (Exception ex){} 
      listView.setAdapter(adapter); 
      break; 
     default: 
      break; 
    } 
} 

@Override 
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    // TODO Auto-generated method stub 
    final int id = (int) adapter.getItemId(arg2); 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Apakah id="+id+" akan dihapus").setCancelable(true).setPositiveButton("Ya", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      // TODO Auto-generated method stub 
      hapusData(id); 
     } 
    }).setNegativeButton("Tidak", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      // TODO Auto-generated method stub 
      dialog.cancel(); 
     } 
    }); 
    AlertDialog alertDialog = builder.create(); 
    alertDialog.show(); 
    return false; 
} 

private void hapusData(long id){ 
    DataHelper dh = new DataHelper(this); 
    try{ 
     dh.deleteById((int)id); 
    }catch (Exception ex){ 
     Toast.makeText(this, "Error: "+ex.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 
} 

Android Button

XML

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.faddi.sql.MainActivity"> 

<LinearLayout 
    android:layout_width="368dp" 
    android:layout_height="70dp" 
    android:orientation="horizontal" 
    tools:layout_editor_absoluteX="8dp" 
    tools:layout_editor_absoluteY="8dp"> 

    <Button 
     android:id="@+id/tambahButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Tambah" /> 

    <Button 
     android:id="@+id/refreshButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Refresh" /> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="368dp" 
    android:layout_height="300dp" 
    android:orientation="vertical" 
    tools:layout_editor_absoluteX="8dp" 
    tools:layout_editor_absoluteY="133dp"> 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:layout_editor_absoluteX="0dp" 
     tools:layout_editor_absoluteY="-51dp" /> 
</LinearLayout> 

</android.support.constraint.ConstraintLayout> 
+0

Ajoutez votre mise en page ** activity_main.xml ** fichier –

+0

@MuthukrishnanRajendran done – faddi

+0

Etes-vous sûr que 'onCreate' a fini de travailler avec le curseur? Je ne vois aucune donnée dans votre liste ... Aussi, pourquoi n'utilisez-vous pas le débogueur au lieu du toast? – Dusan

Répondre

2

problème est votre ListView est au-dessus des boutons, vous utilisez

tools:layout_editor_absoluteX="8dp" 
tools:layout_editor_absoluteY="133dp" 

Donc, dans votre éditeur, il regarde au milieu, mais tout en runnin g il viendra sur le dessus de l'écran.

Définissez donc un ID pour vos boutons de mise en attente LinearLayout et définissez app:layout_constraintTop_toBottomOf cet ID.

changer votre mise en page comme ça,

<LinearLayout 
    android:id="@+id/topView" 
    > 

    <Button 
     /> 

    <Button 
     /> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    app:layout_constraintTop_toBottomOf="@+id/topView" 
    android:orientation="vertical"> 

    <ListView 
     /> 
</LinearLayout> 
+0

Je pense qu'il devrait être possible d'éliminer les deux dispositions linéaires et de simplement placer les boutons et le ListView directement dans le ConstraintLayout. C'est pour ça que c'est conçu. –

+0

@albertcbraun, Vous avez raison à 100% et je suis d'accord avec vous, mais j'ai donné une solution juste pour rendre le bouton cliquable. –

+0

merci. Oui. je suis d'accord avec votre réponse. Je crois que vous avez trouvé et résolu le problème critique dans le code très rapidement! :-) J'ai upvoted votre réponse. Je pense que ce devrait être la réponse acceptée. –

0

On dirait que vous n'êtes pas assignez onClick aux boutons correctement.

Button button = findViewById(R.id.button_id); 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Code here executes after user presses button 
     } 
    }); 
+0

Non, l'écouteur est réglé correctement ... juste une syntaxe différente. – Dusan

0

Ou en vous xml faire dans "Bouton <>":

android: onclick = "methodName()"

Par ex onClick()