一个活动数据正在转移到另一个活动 [英] One activity data is transferring to another activity

查看:59
本文介绍了一个活动数据正在转移到另一个活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在程序中的某个地方遇到逻辑错误,发生的事情是当我在MainActivity中使用时间选择器和Switch,然后在另一个活动(即,作为子类的UtilMainActivity)中选择的时间和Switch状态被更改时发生了.但是,当我在UtilMainActivity中更改开关状态和时间时,并不会导致MainActivity中开关状态和警报时间发生变化.我真正需要的是当我更改警报时间并在MainActivity中进行开关不会导致变化时间并切换到我的UtilMainActivity ..希望您了解我的问题.这是我的MainActivity.

I was in trouble with logical error somewhere in my program, what happening is when I use time picker and Switch in my MainActivity then the time selected and Switch state getting changed in my another activity i.e: UtilMainActivity which is a subclass. But whereas, when I change the switch state and time in my UtilMainActivity it is not resulting in a change of switch state and alarm time in my MainActivity.What I actually need is when I change alarm time and switch in MainActivity does not lead to change of time and switch in my UtilMainActivity.......Hope You understand my problem. Here is My MainActivity.

UtilMainActivity

UtilMainActivity

public class UtilMainActivity extends AppCompatActivity implements
    TimePickerDialog.OnTimeSetListener {

SwitchCompat onOffSwitch;
TextView firstAlarmTextView;
TextView timeLeftTextView;
LinearLayout firstAlarmLayout;
UtilSharedPreferencesHelper sharPrefHelper;
UtilTimerManager utilTimerManager;
UtilAlarmParams utilAlarmParams;
BroadcastReceiver timeLeftReceiver;
private final String LOG_TAG = UtilMainActivity.class.getSimpleName();

final int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 45;
final float DISPLAYED_NUMBERS_SIZE_RELATIVE_TO_TEXT_PROPORTION = 2f;  // number of alarms, first alarm, interval values text size is larger than text around them

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.utility_activity_main);
    onOffSwitch = (SwitchCompat) findViewById(R.id.switch_main);
    firstAlarmLayout = (LinearLayout) findViewById(R.id.layout_main_firstalarm);
    firstAlarmTextView = (TextView) findViewById(R.id.textview_main_firstalarm_time);
    timeLeftTextView = (TextView) findViewById(R.id.textview_main_timeleft);

    sharPrefHelper = new UtilSharedPreferencesHelper(UtilMainActivity.this);
    sharPrefHelper.printAll();

    utilAlarmParams = sharPrefHelper.utilgetParams();
    utilTimerManager = new UtilTimerManager(UtilMainActivity.this);

    showFirstAlarmTime(utilAlarmParams.firstUtilAlarmTime.toString());
    showTimeLeft(utilAlarmParams);

    onOffSwitch.setChecked(sharPrefHelper.isAlarmTurnedOn());


    onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            utilAlarmParams.turnedOn = isChecked;
            if (isChecked) {
                checkNotificationPolicy();
                checkOverlayPermission();
                utilTimerManager.startSingleAlarmTimer(utilAlarmParams.firstUtilAlarmTime.toMillis());
                showToast(getString(R.string.utility_main_alarm_turned_on_toast));
            } else {
                utilTimerManager.cancelTimer();
                showToast(getString(R.string.utility_main_alarm_turned_off_toast));
            }
            showTimeLeft(utilAlarmParams);
            sharPrefHelper.utilsetAlarmState(isChecked);
        }
    });


    firstAlarmLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Bundle timePickerBundle = new Bundle();
            timePickerBundle.putInt(UtilTimePickerDialogFragment.BUNDLE_KEY_ALARM_HOUR, sharPrefHelper.utilgetHour());
            timePickerBundle.putInt(UtilTimePickerDialogFragment.BUNDLE_KEY_ALARM_MINUTE, sharPrefHelper.utilgetMinute());

            UtilTimePickerDialogFragment timePicker = new UtilTimePickerDialogFragment();

            timePicker.setArguments(timePickerBundle);
            timePicker.show(getFragmentManager(), UtilTimePickerDialogFragment.FRAGMENT_TAG);
        }
    });

}

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onResume() {
    super.onResume();
    showTimeLeft(utilAlarmParams);
    timeLeftReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context ctx, Intent intent) {
            if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0) {  //i.e. every minute
                showTimeLeft(utilAlarmParams);
            }
        }
    };
    registerReceiver(timeLeftReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}

@Override
protected void onPause() {
    super.onPause();
    if (timeLeftReceiver != null) {
        unregisterReceiver(timeLeftReceiver);
    }
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onTimeSet(TimePicker view, int hour, int minute) {
    UtilAlarmTime utilAlarmTime = new UtilAlarmTime(hour, minute);
    utilAlarmParams.firstUtilAlarmTime = utilAlarmTime;
    showFirstAlarmTime(utilAlarmTime.toString());
    showTimeLeft(utilAlarmParams);
    resetTimerIfTurnedOn();
    sharPrefHelper.utilsetTime(utilAlarmTime);
}

private void showToast(String message) {
    Toast.makeText(UtilMainActivity.this, message, Toast.LENGTH_SHORT).show();
}

private void resetTimerIfTurnedOn() {
    if (onOffSwitch.isChecked()) {
        utilTimerManager.resetSingleAlarmTimer(utilAlarmParams.firstUtilAlarmTime.toMillis());
        showToast(getString(R.string.utility_main_alarm_reset_toast));
    }
}


private void showFirstAlarmTime(String firstAlarmTime) {
    String wholeTitle = getString(R.string.utility_main_firstalarm_time, firstAlarmTime);
    SpannableString wholeTitleSpan = new SpannableString(wholeTitle);
    wholeTitleSpan.setSpan(new RelativeSizeSpan(DISPLAYED_NUMBERS_SIZE_RELATIVE_TO_TEXT_PROPORTION),
            wholeTitle.indexOf(firstAlarmTime) - 1,
            wholeTitle.indexOf(firstAlarmTime) + firstAlarmTime.length(), 0);
    firstAlarmTextView.setText(wholeTitleSpan);
}

@RequiresApi(api = Build.VERSION_CODES.M)
private void showTimeLeft(UtilAlarmParams utilAlarmParams) {
    UtilAlarmTime utilAlarmTime = utilAlarmParams.firstUtilAlarmTime;
    timeLeftTextView.setText(getString(R.string.utility_all_time_left, utilAlarmTime.getHoursLeft(), utilAlarmTime.getMinutesLeft()));
    if (utilAlarmParams.turnedOn) {
        timeLeftTextView.setTextColor(getColor(R.color.primary));
    } else {
        timeLeftTextView.setTextColor(getColor(R.color.main_disabled_textcolor));
    }
    Log.d(LOG_TAG, "Time left: "+ utilAlarmTime.getHoursLeft() + ":" + utilAlarmTime.getMinutesLeft());
}

private void checkNotificationPolicy() {
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
            && !notificationManager.isNotificationPolicyAccessGranted()) {
        Intent intent = new Intent(
                android.provider.Settings
                        .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
        startActivity(intent);
    }
}

/**
 * needed for Android Q: on some devices activity doesn't show from fullScreenNotification without
 * permission SYSTEM_ALERT_WINDOW
 */
@RequiresApi(api = Build.VERSION_CODES.M)
private void checkOverlayPermission() {
    if ((Build.VERSION.SDK_INT > Build.VERSION_CODES.P) && (!Settings.canDrawOverlays(this))) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + this.getPackageName()));
        startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
    }
}
}

MainActivity

MainActivity

public class MainActivity extends AppCompatActivity implements
    IntervalDialogFragment.IntervalDialogListener,
    NumberOfAlarmsDialogFragment.NumberOfAlarmsDialogListener,
    TimePickerDialog.OnTimeSetListener {

SwitchCompat onOffSwitch;
ListView alarmsListView;
TextView intervalBetweenAlarmsTextView;
TextView numberOfAlarmsTextView;
TextView firstAlarmTextView;
TextView timeLeftTextView;
LinearLayout firstAlarmLayout;
LinearLayout intervalLayout;
LinearLayout numberOfAlarmsLayout;
AlarmsListHelper alarmsListHelper;
SharedPreferencesHelper sharPrefHelper;
TimerManager timerManager;
AlarmParams alarmParams;
BroadcastReceiver timeLeftReceiver;
Button sleepTimer;
private final String LOG_TAG = MainActivity.class.getSimpleName();

final int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 45;
final float DISPLAYED_NUMBERS_SIZE_RELATIVE_TO_TEXT_PROPORTION = 2f;  // number of alarms, first alarm, interval values text size is larger than text around them

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    alarmsListView = (ListView) findViewById(R.id.listview_main_alarmslist);
    onOffSwitch = (SwitchCompat) findViewById(R.id.util_switch_main);
    intervalBetweenAlarmsTextView = (TextView) findViewById(R.id.textview_main_interval);
    numberOfAlarmsTextView = (TextView) findViewById(R.id.textview_main_numberofalarms);
    firstAlarmLayout = (LinearLayout) findViewById(R.id.layout_main_firstalarm);
    firstAlarmTextView = (TextView) findViewById(R.id.util_textview_main_firstalarm_time);
    timeLeftTextView = (TextView) findViewById(R.id.textview_main_timeleft);
    intervalLayout = (LinearLayout) findViewById(R.id.layout_main_interval);
    numberOfAlarmsLayout = (LinearLayout) findViewById(R.id.layout_main_numberofalarms);
    sleepTimer = (Button) findViewById(R.id.sleepTimer);

    sharPrefHelper = new SharedPreferencesHelper(MainActivity.this);
    sharPrefHelper.printAll();

    alarmParams = sharPrefHelper.getParams();
    timerManager = new TimerManager(MainActivity.this);
    alarmsListHelper = new AlarmsListHelper(MainActivity.this, alarmsListView);

    showFirstAlarmTime(alarmParams.firstAlarmTime.toString());
    showTimeLeft(alarmParams);

    showInterval(sharPrefHelper.getIntervalStr());
    showNumberOfAlarms(sharPrefHelper.getNumberOfAlarmsStr());
    onOffSwitch.setChecked(sharPrefHelper.isAlarmTurnedOn());

    alarmsListHelper.showList(alarmParams);

    onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            alarmParams.turnedOn = isChecked;
            if (isChecked) {
                checkNotificationPolicy();
                checkOverlayPermission();
                timerManager.startSingleAlarmTimer(alarmParams.firstAlarmTime.toMillis());
                showToast(getString(R.string.main_alarm_turned_on_toast));
                sharPrefHelper.setNumberOfAlreadyRangAlarms(0);
            } else {
                timerManager.cancelTimer();
                showToast(getString(R.string.main_alarm_turned_off_toast));
            }
            alarmsListHelper.showList(alarmParams);
            showTimeLeft(alarmParams);
            sharPrefHelper.setAlarmState(isChecked);
        }
    });

    intervalLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            IntervalDialogFragment dialog = new IntervalDialogFragment();
            Bundle intervalBundle = new Bundle();
            intervalBundle.putString(IntervalDialogFragment.BUNDLE_KEY_INTERVAL, sharPrefHelper.getIntervalStr());
            dialog.setArguments(intervalBundle);
            dialog.show(getFragmentManager(), IntervalDialogFragment.FRAGMENT_TAG);
        }
    });

    numberOfAlarmsLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NumberOfAlarmsDialogFragment dialog = new NumberOfAlarmsDialogFragment();
            Bundle numberOfAlarmsBundle = new Bundle();
            numberOfAlarmsBundle.putString(NumberOfAlarmsDialogFragment.BUNDLE_KEY_NUMBER_OF_ALARMS, sharPrefHelper.getNumberOfAlarmsStr());
            dialog.setArguments(numberOfAlarmsBundle);
            dialog.show(getFragmentManager(), NumberOfAlarmsDialogFragment.FRAGMENT_TAG);
        }
    });

    firstAlarmLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Bundle timePickerBundle = new Bundle();
            timePickerBundle.putInt(TimePickerDialogFragment.BUNDLE_KEY_ALARM_HOUR, sharPrefHelper.getHour());
            timePickerBundle.putInt(TimePickerDialogFragment.BUNDLE_KEY_ALARM_MINUTE, sharPrefHelper.getMinute());

            TimePickerDialogFragment timePicker = new TimePickerDialogFragment();

            timePicker.setArguments(timePickerBundle);
            timePicker.show(getFragmentManager(), TimePickerDialogFragment.FRAGMENT_TAG);
        }
    });

    sleepTimer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openNewActivity();
        }
    });


}
public void openNewActivity(){
    Intent intent = new Intent(this, SleepTimerActivity.class);
    startActivity(intent);
}

@Override
protected void onResume() {
    super.onResume();
    showTimeLeft(alarmParams);
    timeLeftReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context ctx, Intent intent) {
            if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0) {  //i.e. every minute
                showTimeLeft(alarmParams);
            }
        }
    };
    registerReceiver(timeLeftReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}



@Override
protected void onPause() {
    super.onPause();
    if (timeLeftReceiver != null) {
        unregisterReceiver(timeLeftReceiver);
    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            final View view = findViewById(R.id.scheduleactivity);

            if (view != null) {
                view.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {

                        // Do something...

                        Toast.makeText(getApplicationContext(), "Scheduled Utilities Stopper", Toast.LENGTH_SHORT).show();
                        return true;
                    }
                });
            }
        }
    });
    return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings: {
            Intent intent = new Intent(this, PrefActivity.class);
            startActivity(intent);
            break;
        }
        case R.id.scheduleactivity: {
            Intent intent = new Intent(this, UtilMainActivity.class);
            startActivity(intent);
            break;
        }
    }
    return super.onOptionsItemSelected(item);
}


@Override
public void onIntervalChanged(String intervalStr) {
    showInterval(intervalStr);
    alarmParams.interval = Integer.parseInt(intervalStr);
    alarmsListHelper.showList(alarmParams);
    resetTimerIfTurnedOn();
    sharPrefHelper.setInterval(intervalStr);
}

@Override
public void onNumberOfAlarmsChanged(String numberOfAlarmsStr) {
    showNumberOfAlarms(numberOfAlarmsStr);
    alarmParams.numberOfAlarms = Integer.parseInt(numberOfAlarmsStr);
    alarmsListHelper.showList(alarmParams);
    resetTimerIfTurnedOn();
    sharPrefHelper.setNumberOfAlarms(numberOfAlarmsStr);
}

@Override
public void onTimeSet(TimePicker view, int hour, int minute) {
    AlarmTime alarmTime = new AlarmTime(hour, minute);
    alarmParams.firstAlarmTime = alarmTime;
    showFirstAlarmTime(alarmTime.toString());
    alarmsListHelper.showList(alarmParams);
    showTimeLeft(alarmParams);
    sharPrefHelper.setNumberOfAlreadyRangAlarms(0);
    resetTimerIfTurnedOn();
    sharPrefHelper.setTime(alarmTime);
}

private void showToast(String message) {
    Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
}

private void resetTimerIfTurnedOn() {
    if (onOffSwitch.isChecked()) {
        timerManager.resetSingleAlarmTimer(alarmParams.firstAlarmTime.toMillis());
        showToast(getString(R.string.main_alarm_reset_toast));
    }
}

private void showInterval(String interval) {
    String wholeTitle = getString(R.string.main_interval, interval);
    SpannableString wholeTitleSpan = new SpannableString(wholeTitle);
    wholeTitleSpan.setSpan(new RelativeSizeSpan(DISPLAYED_NUMBERS_SIZE_RELATIVE_TO_TEXT_PROPORTION), wholeTitle.indexOf(interval), interval.length() + 1, 0);
    intervalBetweenAlarmsTextView.setText(wholeTitleSpan);
}

private void showNumberOfAlarms(String numberOfAlarms) {
    int numberOfAlarmsInt = Integer.parseInt(numberOfAlarms);
    String wholeTitle = this.getResources().getQuantityString(R.plurals.main_number_of_alarms, numberOfAlarmsInt, numberOfAlarmsInt);
    SpannableString wholeTitleSpan = new SpannableString(wholeTitle);
    wholeTitleSpan.setSpan(new RelativeSizeSpan(DISPLAYED_NUMBERS_SIZE_RELATIVE_TO_TEXT_PROPORTION),
            wholeTitle.indexOf(numberOfAlarms),
            numberOfAlarms.length() + 1, 0);
    numberOfAlarmsTextView.setText(wholeTitleSpan);
}

private void showFirstAlarmTime(String firstAlarmTime) {
    String wholeTitle = getString(R.string.main_firstalarm_time, firstAlarmTime);
    SpannableString wholeTitleSpan = new SpannableString(wholeTitle);
    wholeTitleSpan.setSpan(new RelativeSizeSpan(DISPLAYED_NUMBERS_SIZE_RELATIVE_TO_TEXT_PROPORTION),
            wholeTitle.indexOf(firstAlarmTime) - 1,
            wholeTitle.indexOf(firstAlarmTime) + firstAlarmTime.length(), 0);
    firstAlarmTextView.setText(wholeTitleSpan);
}

private void showTimeLeft(AlarmParams alarmParams) {
    AlarmTime alarmTime = alarmParams.firstAlarmTime;
    timeLeftTextView.setText(getString(R.string.all_time_left, alarmTime.getHoursLeft(), alarmTime.getMinutesLeft()));
    if (alarmParams.turnedOn) {
        timeLeftTextView.setTextColor(getColor(R.color.primary));
    } else {
        timeLeftTextView.setTextColor(getColor(R.color.main_disabled_textcolor));
    }
    Log.d(LOG_TAG, "Time left: "+alarmTime.getHoursLeft() + ":" + alarmTime.getMinutesLeft());
}

private void checkNotificationPolicy() {
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
            && !notificationManager.isNotificationPolicyAccessGranted()) {
        Intent intent = new Intent(
                android.provider.Settings
                        .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
        startActivity(intent);
    }
}

/**
 * needed for Android Q: on some devices activity doesn't show from fullScreenNotification without
 * permission SYSTEM_ALERT_WINDOW
 */
private void checkOverlayPermission() {
    if ((Build.VERSION.SDK_INT > Build.VERSION_CODES.P) && (!Settings.canDrawOverlays(this))) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + this.getPackageName()));
        startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
    }
}

}

推荐答案

您的活动不会获取新数据,因为它的接收者已经注销,为了让您更轻松,我建议您开始活动使用 startActivityForResult 这样完成时,可以设置数据,并且上一个活动将在此回调 onActivityResult(...)

Your activity, won't get the new data, because it's receiver was already unregistered, to make this easier for you, I would advise, you start the activity with startActivityForResult that way when you are done, you can set the data and the previous activity will receive the data in a bundle on this callback onActivityResult(...)

这篇关于一个活动数据正在转移到另一个活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆