2016-11-09 2 views
0

Новое в Android-программировании и проблема с программированием приложения с действиями для списка дел, журнала времени, журнала затрат и журнала упражнений. Каждое действие представляет собой список с несколькими вариантами выбора. Например:Список дел на Android

TO-DO: Это одностраничный список дел. Пользователь не может добавлять дополнительные страницы списка дел. Поэтому экран выглядит пустым с двумя кнопками внизу: ADD и DELETE. Пользователь будет использовать кнопку «Назад назад» для выхода из этой операции и возврата к основному представлению. Вы должны предоставить хороший фон для этого списка дел, который хорошо работает с темой этой функции и не слишком «шумно», чтобы посмотреть. Вы должны использовать представление списка, которое доступно для прокрутки. Каждая запись должна предоставить пользователю возможность пометить его как завершенную. Кнопка ADD отображает всплывающее текстовое поле для ввода пользователем своего предмета. Всплывающее окно имеет кнопку DONE и CANCEL. Нажатие DONE добавляет элемент списка дел в конец списка дел. Нажатие CANCEL возвращает пользователя в список дел, но не добавляет текст из всплывающего окна.

Мне нужно использовать фрагменты, но у вас возникли проблемы с пониманием того, как запрограммировать ListFragment, который будет привязан ко всем действиям.

К-DO активность:

public class ToDoActivity extends Activity implements ListViewFragment.OnItemSelectedListener { 

    final Context context = this; 
    private ArrayAdapter<String> adapter; 
    private ArrayList<String> arrayList = new ArrayList<>(); 
    private ListView toDoList; 


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

     // SET ACTION BAR 
     ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayShowTitleEnabled(false); 

     adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_multiple_choice, arrayList); 
    } 


     @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public void onButtonItemSelected(String link) { 
     if (link.contentEquals("add")) { 
      final Dialog dialog = new Dialog(context); 
      LayoutInflater inflater = getLayoutInflater(); 
      dialog.setContentView(inflater.inflate(R.layout.todo_dialog, null)); 
      dialog.setTitle("Add Task"); 
      dialog.show(); 

      final EditText task = (EditText) dialog.findViewById(R.id.etTaskInfo); 
      Button btDone = (Button) dialog.findViewById(R.id.btDone); 

      btDone.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        arrayList.add(task.getText().toString()); 
        adapter.notifyDataSetChanged(); 
        dialog.dismiss(); 
       } 
      }); 

      Button btCancel = (Button) dialog.findViewById(R.id.btCancel); 

      btCancel.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        dialog.dismiss(); 
       } 
      }); 
     } 
     if (link.contentEquals("delete")) { 
      int count = toDoList.getCount(); 
      SparseBooleanArray checkedItemPositions = toDoList.getCheckedItemPositions(); 
      for (int i=0; i < count; i++) { 
       if (checkedItemPositions.get(i)) 
        arrayList.remove(i); 
      } 
      adapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.menuitem_exit) { 
      new AlertDialog.Builder(this) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .setMessage("Are you sure?") 
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
        { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          finish(); 
         } 

        }) 
        .setNegativeButton("No", null) 
        .show(); 
     } 

     if (id == R.id.menuitem_help) { 
      Intent helpIntent = new Intent(ToDoActivity.this, Help.class); 
      helpIntent.putExtra("helptext", getString(R.string.help_todo)); 
      startActivity(helpIntent); 
     } 

     if (id == R.id.menuitem_settings) { 
      Intent settingsIntent = new Intent(ToDoActivity.this, Settings.class); 
      startActivity(settingsIntent); 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

LISTVIEWFRAGMENT:

public class ListViewFragment extends Fragment { 

    private String information; 
    private OnItemSelectedListener listener; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.list_fragment, container, false); 

     Button btAdd = (Button) view.findViewById(R.id.btAdd); 
     btAdd.setOnClickListener(actionSelectedListener); 

     Button btDel = (Button) view.findViewById(R.id.btDelete); 
     btDel.setOnClickListener(actionSelectedListener); 

     return view; 
    } 

    private OnClickListener actionSelectedListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String description = (String) getView().getContentDescription(); 
      information = description; 
      passSelection(); 
     } 
    }; 

    public interface OnItemSelectedListener { 
     void onButtonItemSelected(String link); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof OnItemSelectedListener) { 
      listener = (OnItemSelectedListener) activity; 
     } 
     else { 
      throw new ClassCastException(activity.toString() + "must implement ListViewFragment.OnItemSelectedListener"); 
     } 
    } 

    public void passSelection() { 
     listener.onButtonItemSelected(information); 
    } 
} 

LIST_FRAGMENT.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:background="@drawable/todo_bkgd" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="25sp" 
     android:background="@color/light_grey"/> 

    <Button 
     android:layout_width="150dp" 
     android:layout_height="wrap_content" 
     android:id="@+id/btAdd" 
     android:layout_marginBottom="25dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_marginStart="25dp" 
     android:background="@color/grey" 
     android:text="@string/add_btn" 
     android:textColor="@color/white" 
     android:textSize="20sp" 
     android:gravity="center" 
     android:contentDescription="@string/add_btn" /> 

    <Button 
     android:layout_width="150dp" 
     android:layout_height="wrap_content" 
     android:id="@+id/btDelete" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_marginBottom="25dp" 
     android:layout_marginEnd="25dp" 
     android:background="@color/grey" 
     android:text="@string/delete_btn" 
     android:textColor="@color/white" 
     android:textSize="20sp" 
     android:gravity="center" 
     android:contentDescription="@string/delete_btn" /> 

</RelativeLayout> 

TODO.XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <!--FRAGMENT: list_fragment.xml--> 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <fragment 
      android:id="@+id/fragment1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      class="mcgill.christina.personaldataassistant_actionbar.ListViewFragment" 
      tools:layout="@layout/list_fragment"/> 

</LinearLayout> 
+0

Ваш список Фрагмент не имеет адаптера или списка. Начните с этого –

+0

Кроме того, тщательный 'ListFragment' уже является классом в библиотеке Android. https://developer.android.com/reference/android/support/v4/app/ListFragment.html –

+0

Спасибо, я добавил адаптер и список. Теперь я запутался, имея список массивов внутри фрагмента - как я могу использовать этот фрагмент в активности? – Tina

ответ

0

Адаптер в действии полностью отделен от адаптера внутри фрагмента. Фактически, адаптер в Activity не настроен ни на что, а адаптер Fragment просто пуст, поэтому он прекрасно объясняет, почему вы ничего не видите.

В основном, переместите методы добавления и удаления в класс фрагментов. Я не уверен, как вы хотите обрабатывать кнопки добавления и удаления, но вы можете сделать процесс более сложным, чем то, что вам нужно. Другими словами, ваш фрагмент просто ListView ... Там действительно нет необходимости для него

В любом случае, если вы действительно хотите, чтобы протестировать фрагмент даже отображает что-либо добавить данные к тому, что у вас уже есть

Для пример

public class ListViewFragment extends Fragment { 

    private ArrayAdapter<String> adapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.list_fragment, container, false); 

     // fixed this id reference 
     ListView listView = (ListView) view.findViewById(android.R.id.list); 

     adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_multiple_choice, arrayList); 
     listView.setAdapter(adapter); 

     adapter.add("Working?"); 

     return view; 
} 
+0

Спасибо за вашу помощь. Я обновил свой код, чтобы сделать мой фрагмент более полезным. Но нажатие на add не работает, сбой приложений из-за исключения с нулевым указателем. Похоже, что ToDoActivity не получает строчную ссылку из фрагмента. – Tina

+0

Я не могу догадаться, что говорит stacktrace для NullPointerException, но он должен указывать на номер строки нулевого значения. –

+0

Да, это указывает на «if (link.contentEquals (« add »))». Проблема заключается в ссылке String. – Tina

Смежные вопросы