Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从android片段调用方法_Android_Android Activity_Methods - Fatal编程技术网

从android片段调用方法

从android片段调用方法,android,android-activity,methods,Android,Android Activity,Methods,我尝试从片段活动调用一个方法 public class FragmentHome extends Fragment { private String DATABASE_NAME = "Alarm.sqlite"; private SQLiteDatabase Database; ListView listView; ArrayList<alarm> list; AdapterAlarm adapterAlarm; Intent i

我尝试从片段活动调用一个方法

public class FragmentHome extends Fragment {

    private String DATABASE_NAME = "Alarm.sqlite";
    private SQLiteDatabase Database;

    ListView listView;
    ArrayList<alarm> list;
    AdapterAlarm adapterAlarm;

    Intent intent;
    AlarmManager alarmManager;
    PendingIntent pendingIntent;

    Switch aSwitch;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_fragment_home, container, false);
        listView = (ListView)view.findViewById(R.id.lv);
        //khoi tao arraylist va adapter
        list = new ArrayList<alarm>();
        adapterAlarm = new AdapterAlarm(list, getActivity());
        //set adapter len listview
        listView.setAdapter(adapterAlarm);
        //đăng ký context menu
        registerForContextMenu(view.findViewById(R.id.lv));

        return  view;
    }

    @Override
    public void onStart() {
        super.onStart();
        getData();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        this.getActivity().getMenuInflater().inflate(R.menu.menu_listview_home, menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        alarm al = list.get(info.position);
        int id = al.getId();
        switch(item.getItemId()) {
            case R.id.edit:
                //sửa báo thức
                Intent in = new Intent(getActivity(), EditActivity.class);
                Bundle b = new Bundle();
                b.putInt("Id", id);
                in.putExtra("data", b);
                startActivity(in);

                break;
            case R.id.delete:
                //xóa báo thức
                deleteItem(id);
                break;
        }
        return true;
    }

    public void getData(){
        //doc du lieu tu db len arraylist
        Database = database.initDatabase(getActivity(), DATABASE_NAME);
        Cursor cursor = Database.rawQuery("SELECT*FROM Alarm", null);
        list.clear();
        for(int i=0; i<cursor.getCount(); i++) {
            //di chuyển cursor đến vị trí thứ i
            cursor.moveToPosition(i);
            //thêm đối tượng vào list
            list.add(new alarm(cursor.getInt(0), cursor.getString(1), cursor.getString(2)
                    , cursor.getInt(3), cursor.getInt(4), cursor.getInt(5)));

            //Lấy giờ từ db ra, tách giờ, phút
            alarm al = list.get(i);
            int hour = 0, minute=0;
            for (int j=0; j<al.getTime().length(); j++){
                //lấy giờ
                String ch1 = String.valueOf(al.getTime().charAt(0));
                String ch2 = String.valueOf(al.getTime().charAt(1));
                String t;
                if(ch2.equals(":")){
                    t = ch1;
                }else{
                    t=ch1+ch2;
                }
                hour = Integer.parseInt(t);

                //lấy phút
                String ch3 = String.valueOf(al.getTime().charAt(3));
                String ch4 = String.valueOf(al.getTime().charAt(4));
                //kiem tra neu so cuoi cung cua minute la " " thi chi lay ki tu thu 3
                String m;
                if(ch4.equals(" ")){
                    m =ch3;
                }else{
                    m =ch3+ch4;
                }

                minute = Integer.parseInt(m);

            }
            if(cursor.getInt(5)==1){
                setAlarm(hour, minute, getActivity());
            }
        }
        //bat su kien khi co thay doi du lieu tren adapter
        adapterAlarm.notifyDataSetChanged();
    }

    public void setAlarm(int hour, int minute, Context context){
        //khởi tạo đối tượng calender
        Calendar calendar = Calendar.getInstance();
        //lấy giờ hiện tại của hệ thống
        calendar.setTimeInMillis(System.currentTimeMillis());
        //đặt giờ báo thức
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, 0);
        //khởi tạo intent
        intent = new Intent(getContext(), Alarm_Receiver.class);
        intent.putExtra("extra", "yes");
        //khởi tạo đối tượng pending intent
        pendingIntent = PendingIntent.getBroadcast(getContext(), 0, intent, 0);
        //khởi tạo đối tường alarmmanager
        alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        //đặt báo thức lặp lại hằng ngày
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
    }

    public void cancelAlarm(){
        if(alarmManager!=null){
            intent.putExtra("extra", "no");
            alarmManager.cancel(pendingIntent);
            getActivity().sendBroadcast(intent);
        }
    }

    private void deleteItem(final int id){
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Confirm");
        builder.setMessage("Are you sure, Do you want delete?");
        builder.setNegativeButton("No", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();
            }
        });

        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // TODO Auto-generated method stub
                Database = database.initDatabase(getActivity(), DATABASE_NAME);
                Database.delete("Alarm", "ID = ?", new String[]{id+""});

                //doc lại dữ liệu cho listview
                Database = database.initDatabase(getActivity(), DATABASE_NAME);
                Cursor cursor = Database.rawQuery("SELECT*FROM Alarm", null);
                list.clear();
                for(int i=0; i<cursor.getCount(); i++){
                    //di chuyển cursor đến vị trí thứ i
                    cursor.moveToPosition(i);
                    //thêm đối tượng vào list
                    list.add(new alarm(cursor.getInt(0), cursor.getString(1), cursor.getString(2)
                            , cursor.getInt(3), cursor.getInt(4), cursor.getInt(5)));
                }
                //bat su kien khi co thay doi du lieu tren adapter
                adapterAlarm.notifyDataSetChanged();

                Toast.makeText(getActivity(), "Delete sucessfully!", Toast.LENGTH_SHORT).show();
            }
        });
        builder.setIcon(R.drawable.logo);
        builder.create().show();
    }

    @Override
    public void onResume() {
        super.onResume();
    }
}

但它不起作用?

问题似乎在于您从未初始化alarmManager变量,因此当该代码被命中时,它为null,因此不会发生任何事情

public void cancelAlarm(){
    if(alarmManager!=null){ ...
根据您的代码,似乎在调用cancelAlarm()之前必须先调用setAlarm()

尝试以下方法:

FragmentHome fh = new FragmentHome();
fh.setAlarm(12, 30, this);
fh.cancelAlarm();

我建议花一些时间来学习设置断点并在调试模式下运行应用程序。像这样的错误很容易发现。

您好,欢迎使用StackOverflow!请发布您看到的任何错误消息,以及有关它如何“不工作”的更多详细信息。请参阅以获取指导。抱歉,应用程序运行正常,但这就像我不调用任何方法一样,我尝试在cancelAlarm()中Toast,但它是don't Toast Anything您是否尝试过将日志放在fh.cancelAlarm()之前及其内部?谢谢,我明天再试,在我的国家是午夜(对不起,我的英语)
FragmentHome fh = new FragmentHome();
fh.setAlarm(12, 30, this);
fh.cancelAlarm();