2016-11-04 8 views
-1

Grundsätzlich habe ich listview in meinem Fragment-Layout. Und ein anderes Layout namens item_todo.xml, das meine Schaltfläche enthält. Die onClick() funktionierte nicht beim Klicken auf die Schaltfläche delete_task in meinem Layout. Es wäre toll, wenn du mir helfen könntest!onClick funktioniert nicht in Fragment

Hier ist meine Klasse ToDoFragment

public class ToDoFragment extends Fragment { 

    private static final String TAG = "MainActivity"; 
    private TaskDbHelper mHelper; 
    private ListView mTaskListView; 
    private ArrayAdapter<String> mAdapter; 
    Button myButton; 
    FloatingActionButton btnadd; 
    //Overriden method onCreateView 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_two, container, false); 



     mHelper = new TaskDbHelper(getActivity()); 
     mTaskListView = (ListView) view.findViewById(R.id.list_todo); 

     //Floating action button 

     btnadd = (FloatingActionButton) view.findViewById(R.id.btnadd); 
     btnadd.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final EditText taskEditText = new EditText(getActivity()); 
       AlertDialog dialog = new AlertDialog.Builder(getActivity()) 
         .setTitle("Add a new task") 
         .setMessage("What do you want to do next?") 
         .setView(taskEditText) 
         .setPositiveButton("Add", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           String task = String.valueOf(taskEditText.getText()); 
           SQLiteDatabase db = mHelper.getWritableDatabase(); 
           ContentValues values = new ContentValues(); 
           values.put(TaskContract.TaskEntry.COL_TASK_TITLE, task); 
           db.insertWithOnConflict(TaskContract.TaskEntry.TABLE, 
             null, 
             values, 
             SQLiteDatabase.CONFLICT_REPLACE); 
           db.close(); 
           updateUI(); 
          } 
         }) 
         .setNegativeButton("Cancel", null) 
         .create(); 
       dialog.show(); 
      } 
     }); 


     updateUI(); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle saved){ 
     super.onActivityCreated(saved); 
     final LayoutInflater factory = getActivity().getLayoutInflater(); 
     final View textEntryView = factory.inflate(R.layout.item_todo, null); 
     myButton = (Button) textEntryView.findViewById(R.id.task_delete); 
     myButton.setOnClickListener(new View.OnClickListener() { 
      // OnClick() Not Working !! 

      @Override 
      public void onClick(View view) { 

       deleteTask(view); 
      } 
     }); 
    } 

    public void deleteTask(View view) { 
     View parent = (View) view.getParent(); 
     TextView taskTextView = (TextView) parent.findViewById(R.id.task_title); 
     String task = String.valueOf(taskTextView.getText()); 
     SQLiteDatabase db = mHelper.getWritableDatabase(); 
     db.delete(TaskContract.TaskEntry.TABLE, 
       TaskContract.TaskEntry.COL_TASK_TITLE + " = ?", 
       new String[]{task}); 
     db.close(); 
     updateUI(); 
    } 


    private void updateUI() { 
     ArrayList<String> taskList = new ArrayList<>(); 
     SQLiteDatabase db = mHelper.getReadableDatabase(); 
     Cursor cursor = db.query(TaskContract.TaskEntry.TABLE, 
       new String[]{TaskContract.TaskEntry._ID, TaskContract.TaskEntry.COL_TASK_TITLE}, 
       null, null, null, null, null); 
     while (cursor.moveToNext()) { 
      int idx = cursor.getColumnIndex(TaskContract.TaskEntry.COL_TASK_TITLE); 
      taskList.add(cursor.getString(idx)); 
     } 

     if (mAdapter == null) { 
      mAdapter = new ArrayAdapter<>(getActivity(), 
        R.layout.item_todo, 
        R.id.task_title, 
        taskList); 
      mTaskListView.setAdapter(mAdapter); 
     } else { 
      mAdapter.clear(); 
      mAdapter.addAll(taskList); 
      mAdapter.notifyDataSetChanged(); 
     } 

     cursor.close(); 
     db.close(); 
    }} 

Fragment_two XML

 <ListView 
      android:id="@+id/list_todo" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentRight="true" 
      android:layout_marginBottom="16dp" 
      android:layout_marginRight="16dp" 
      android:orientation="horizontal" > 


      <android.support.design.widget.FloatingActionButton 
       android:layout_width="50dp" 
       android:id="@+id/btnadd" 
       android:layout_height="50dp" 
       app:fabSize="normal" 
       android:clickable="true" 
       android:src="@drawable/red" 
       android:scaleType="center" 
       /> 
     </LinearLayout> 


    </RelativeLayout> 

item_todo XML

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

    <TextView 
     android:id="@+id/task_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:text="Hello" 
     android:textSize="20sp" /> 

    <Button 
     android:id="@+id/task_delete" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:text="Done" /> 

</RelativeLayout> 
+0

können Sie fügen den Fehler hinzu, den Sie bekommen –

+0

Sie fügen nie Ihre aufgeblähte 'textEntryView' zu Ihrem Fragment hinzu. –

+0

@NeelaySrivastava Es gibt keinen Fehler als solchen. Es ist nur, dass nichts passiert, wenn ich die Schaltfläche mit ID = "task_delete" –

Antwort

0

Sie aufblasen eine neue Ansicht in Ihrem onActivityCreated Aber Sie nie verwendet diese Ansicht !!! myButton beziehen sich auf eine Schaltfläche, deren Ansicht nicht verwendet wurde!

Edit:

Es gibt viele Möglichkeiten, wie Sie Ihr Ziel erreichen können:

Schnittstellen

Sie eine Schnittstelle initialisieren kann und es zu fragmentieren passieren, so, wenn etwas passieren in Ihre Aktivität (Knopf klicken zum Beispiel), werden Sie verstehen

BroadcastReceivers

Sie können in Ihrem Fragment lokalen Rundfunkempfänger registrieren und wenn Benutzer klicken Sie auf den Button, können Sie diese Sendung senden, so Fragment

verstehen werde ich die zweite vorschlagen und mit EVENTBUS Bibliothek

+0

Ja, tatsächlich, da sich meine Schaltfläche in einem anderen Layout befindet. Um den NullPointer-Fehler in der Zeile zu vermeiden, die myButton.setOnClickListener enthält, habe ich eine neue Ansicht infiltriert. Kannst du mich auf den richtigen Weg führen? –

+0

lässt sich sagen, dass Sie eine Aktivität haben, in der die Schaltfläche enthalten ist und Sie ein Fragment in der Aktivität haben? und Sie möchten Zugriff auf die Schaltfläche im Fragment haben. habe ich recht ? @AnkitShah –

+0

Ja genau. Ich möchte auf die Schaltfläche in der item_todo.xml aus der ToDoFragment.class zugreifen –