Java TextView()从活动更改为片段时为null
到目前为止,当我运行与活动相同的应用程序时,错误在粗体文本行中,它正确地给出了输出,但在片段中,它生成了null并抛出null指针异常 下面是调试映像 活跃 零碎 以下是AlarmTimePickerDialog类中的showtime方法:Java TextView()从活动更改为片段时为null,java,android,android-studio,android-activity,android-fragmentactivity,Java,Android,Android Studio,Android Activity,Android Fragmentactivity,到目前为止,当我运行与活动相同的应用程序时,错误在粗体文本行中,它正确地给出了输出,但在片段中,它生成了null并抛出null指针异常 下面是调试映像 活跃 零碎 以下是AlarmTimePickerDialog类中的showtime方法: public void showTimeLeft(int hour, int minute) { if (getContext().getResources().getConfiguration().orientation == Config
public void showTimeLeft(int hour, int minute) {
if (getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
TextView textView = (TextView) this.findViewById(R.id.textview_timepickerdialog_timeleft);
AlarmTime time = new AlarmTime(hour, minute);
**textView.setText(getContext().getString(R.string.all_time_left, time.getHoursLeft(), time.getMinutesLeft()));**
}
}
这是日志
2020-06-23 15:16:42.586 9082-9082/com.vikaskonaparthi.time E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.vikaskonaparthi.time, PID: 9082
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.vikaskonaparthi.time.dialogs.AlarmTimePickerDialog.showTimeLeft(AlarmTimePickerDialog.java:44)
at com.vikaskonaparthi.time.dialogs.TimePickerDialogFragment$1.onShow(TimePickerDialogFragment.java:52)
at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1413)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7397)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
这是我在应用程序中用作选项卡的片段
public class Fragment1 extends Fragment 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;
private final String LOG_TAG = Fragment1.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
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment1,container,false);
alarmsListView = (ListView) root.findViewById(R.id.listview_main_alarmslist);
onOffSwitch = (SwitchCompat) root.findViewById(R.id.switch_main);
intervalBetweenAlarmsTextView = (TextView) root.findViewById(R.id.textview_main_interval);
numberOfAlarmsTextView = (TextView) root.findViewById(R.id.textview_main_numberofalarms);
firstAlarmLayout = (LinearLayout) root.findViewById(R.id.layout_main_firstalarm);
firstAlarmTextView = (TextView) root.findViewById(R.id.textview_main_firstalarm_time);
timeLeftTextView = (TextView) root.findViewById(R.id.textview_main_timeleft);
intervalLayout = (LinearLayout) root.findViewById(R.id.layout_main_interval);
numberOfAlarmsLayout = (LinearLayout) root.findViewById(R.id.layout_main_numberofalarms);
sharPrefHelper = new SharedPreferencesHelper(getActivity());
sharPrefHelper.printAll();
alarmParams = sharPrefHelper.getParams();
timerManager = new TimerManager(getActivity());
alarmsListHelper = new AlarmsListHelper(getActivity(), 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(getChildFragmentManager(), 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(getChildFragmentManager(), 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(getChildFragmentManager(), TimePickerDialogFragment.FRAGMENT_TAG);
}
});
return root;
}
@Override
public 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);
}
}
};
getActivity().registerReceiver(timeLeftReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}
@Override
public void onPause() {
super.onPause();
if (timeLeftReceiver != null) {
getActivity().unregisterReceiver(timeLeftReceiver);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_settings: {
Intent intent = new Intent(getActivity(), PrefActivity.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(getActivity(), 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) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
timeLeftTextView.setTextColor(getActivity().getColor(R.color.primary));
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
timeLeftTextView.setTextColor(getActivity().getColor(R.color.main_disabled_textcolor));
}
}
Log.d(LOG_TAG, "Time left: "+alarmTime.getHoursLeft() + ":" + alarmTime.getMinutesLeft());
}
private void checkNotificationPolicy() {
NotificationManager notificationManager =
(NotificationManager) getActivity().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.M) {
if ((Build.VERSION.SDK_INT > Build.VERSION_CODES.P) && (!Settings.canDrawOverlays(getActivity()))) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getActivity().getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}
}
}
}
下面是alarmTimePickerDialog类,它正在引发异常
public class AlarmTimePickerDialog extends TimePickerDialog {
public AlarmTimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute,
boolean is24HourView) {
super(context, listener, hourOfDay, minute, is24HourView);
}
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
super.onTimeChanged(view, hourOfDay, minute);
showTimeLeft(hourOfDay, minute);
}
@Override
public void setCustomTitle(View customTitleView) {
if (getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { //title is displayed in portrait orientation only
super.setCustomTitle(customTitleView);
}
}
public void showTimeLeft(int hour, int minute) {
if (getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
TextView textView = (TextView) this.findViewById(R.id.textview_timepickerdialog_timeleft);
AlarmTime time = new AlarmTime(hour, minute);
textView.setText(getContext().getString(R.string.all_time_left, time.getHoursLeft(), time.getMinutesLeft()));
}
}
}
下面是部分时间选择器对话框标题的xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/textview_timepickerdialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:textSize="18sp"
android:textColor="@color/main_textcolor"
android:gravity="left"
android:text="@string/timepicker_dialog_title"
/>
<TextView
android:id="@+id/textview_timepickerdialog_timeleft"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp"
android:paddingBottom="0dp"
android:textSize="18sp"
android:gravity="right"
android:textColor="@color/primary"
/>
提前感谢您创建了如下全局变量:
private View root; // global
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
root = inflater.inflate(R.layout.fragment1,container,false); //here it already exist, so you just assign
alarmsListView = (ListView) root.findViewById(R.id.listview_main_alarmslist);
onOffSwitch = (SwitchCompat) root.findViewById(R.id.switch_main);
intervalBetweenAlarmsTextView = (TextView) root.findViewById(R.id.textview_main_interval);
numberOfAlarmsTextView = (TextView) root.findViewById(R.id.textview_main_numberofalarms);
firstAlarmLayout = (LinearLayout) root.findViewById(R.id.layout_main_firstalarm);
firstAlarmTextView = (TextView) root.findViewById(R.id.textview_main_firstalarm_time);
timeLeftTextView = (TextView) root.findViewById(R.id.textview_main_timeleft);
intervalLayout = (LinearLayout) root.findViewById(R.id.layout_main_interval);
numberOfAlarmsLayout = (LinearLayout) root.findViewById(R.id.layout_main_numberofalarms);
sharPrefHelper = new SharedPreferencesHelper(getActivity());
sharPrefHelper.printAll();
alarmParams = sharPrefHelper.getParams();
timerManager = new TimerManager(getActivity());
alarmsListHelper = new AlarmsListHelper(getActivity(), 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(getChildFragmentManager(), 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(getChildFragmentManager(), 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(getChildFragmentManager(), TimePickerDialogFragment.FRAGMENT_TAG);
}
});
return root;
}
public class AlarmTimePickerDialog extends TimePickerDialog {
public interface TimeLeftCallback {
setTextView();
}
TimeLeftCallback mCallback;
public AlarmTimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute,
boolean is24HourView, TimeLeftCallback callback) {
super(context, listener, hourOfDay, minute, is24HourView);
mCallback = callback;
}
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
super.onTimeChanged(view, hourOfDay, minute);
showTimeLeft(hourOfDay, minute);
}
@Override
public void setCustomTitle(View customTitleView) {
if (getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { //title is displayed in portrait orientation only
super.setCustomTitle(customTitleView);
}
}
public void showTimeLeft(int hour, int minute) {
if (getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
AlarmTime time = new AlarmTime(hour, minute);
mCallback.setTextView();
}
}
}
然后在你的方法中:
public void showTimeLeft(int hour, int minute) {
if (getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
TextView textView = (TextView) root.findViewById(R.id.textview_timepickerdialog_timeleft); // here
AlarmTime time = new AlarmTime(hour, minute);
textView.setText(getContext().getString(R.string.all_time_left, time.getHoursLeft(), time.getMinutesLeft()));
}
}
->编辑此错误将在textview上显示空指针,因此,请检查您是否正确地辅助它是的,我正在编写它,它在用作活动时提供了正确的输出,但当我将其更改为片段时,它会生成此错误friend。您是否尝试调试它?您不能这样做。findViewById对于片段,您必须在根布局上调用它。在给定代码中,我看不到您在哪里实际上正在使用部分\u timepicker\u dialog\u title布局。好的,但是root不属于alarmTimePickerDialog类方法friend。但是我们在片段中声明了root,但错误在alarmTimePickerDialog中。谢谢您的帮助。您能帮我检查我的编辑吗。我希望你能理解,因为我写得很匆忙。
AlarmTimePickerDialog(/*your parameters*/ , new AlarmTimePickerDialog.TimeLeftCallback() {
@Override
setTextView() {
// and here you can set your TextView using global root, because it is inside fragment already
}