1

Ich habe eine Reihe von Schaltflächen in einem Tabellenlayout definiert.Button Klick Ereignis wird nicht ausgelöst

custom_layout.xml:

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

<TableLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingBottom="10dp" 
    android:id="@+id/tableLayout"> 

    <TableRow 
     android:layout_weight="1"> 
     <Button 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/firstBtn" 
      android:text="F" 
      android:layout_weight="0.3"> 
     </Button> 

     <Button 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/secondBtn" 
      android:text="S" 
      android:layout_weight="0.3"> 
     </Button> 

     <Button 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/thirdBtn" 
      android:text="T" 
      android:layout_weight="0.3"> 
     </Button> 

    </TableRow> 

    </TableLayout> 

</RelativeLayout> 

Dieses XML wird als Layout innerhalb eines benutzerdefinierten Alarm Dialog eingestellt.

Code:

public class CustomDialogPreference extends DialogPreference { 


private Button firstBtn = null; 
private Button secondBtn = null; 
private Button thirdBtn = null; 


public CustomDialogPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setPersistent(false); 
    this.context = context; 
    setDialogLayoutResource(R.layout.custom_layout); 



} 

@Override 
protected void onBindDialogView(View view) { 

    firstBtn = (Button)view.findViewById(R.id.firstBtn); 
    secondBtn = (Button)view.findViewById(R.id.secondBtn); 
    thirdBtn = (Button)view.findViewById(R.id.thirdBtn); 

    firstBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Log.d("Check","First button is clicked")); 

     } 
    }); 

    secondBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Log.d("Check","Second button is clicked")); 

     } 
    }); 

    thirdBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Log.d("Check","Third button is clicked")); 

     } 
    }); 


    super.onBindDialogView(view); 
} 

@Override 
protected void onDialogClosed(boolean positiveResult) { 
    super.onDialogClosed(positiveResult); 
    persistBoolean(positiveResult); 

    Log.d("Blockout","Dialog close detected"); 
    if(positiveResult) 
    { 

     Log.d("Blockout","Save button had been clicked"); 

    } 

    } 

} 

Wenn der Dialog geöffnet und ich auf den Schaltflächen klicken, ich bin nicht in der Lage, die entsprechenden Log-Meldungen zu sehen. Ich bekomme auch keine Null-Zeiger-Ausnahmen, daher denke ich, dass die Ansichten richtig gesetzt und aufgerufen werden. Irgendeine Idee, was ich vermisse?

+0

wie haben öffnen Sie den Dialog? teilen Sie Ihren Code –

+0

Ich setze diesen Dialog innerhalb einer Präferenz Bildschirm Xml (nicht durch Code) .. und der Dialog öffnet sich und einige andere Elemente in den benutzerdefinierten Dialog sind zugänglich (ich habe das hier nicht enthalten, da es nicht relevant für die Frage) – SoulRayder

+0

machen Sie einen Toast anstelle von Log. –

Antwort

1

Wenn Sie einen benutzerdefinierten Dialog wünschen, würde ich die DialogFragment Klasse vorschlagen. Es gibt eine Dokumentation über diese - Dialogs.

Ich denke, Sie wollen diese Methode - onCreateDialogView.

Zum Beispiel

public class CustomDialogPreference extends DialogPreference 
    implements View.OnClickListener { 

    private Context context; 

    public CustomDialogPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setPersistent(false); 
     this.context = context; 
    } 

    @Override 
    protected View onCreateDialogView() { 
     super.onCreateDialogView(); 
     LayoutInflater inflater = LayoutInflater.from(this.context); 
     View rootView = inflater.inflate(R.layout.custom_layout,null); 

     rootView.findViewById(R.id.firstBtn).setOnClickListener(this); 
     rootView.findViewById(R.id.secondBtn).setOnClickListener(this); 

     return rootView; 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.firstBtn: 
       Log.d("Check","First button is clicked")); 
       break; 
      case R.id.secondBtn: 
       break; 
     } 
    } 
+0

danke für die Antwort, eine kleine Korrektur: inflater.inflate() nimmt keinen einzigen int-Parameter. Bearbeitete die Post mit der Korrektur. – SoulRayder

Verwandte Themen