Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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
Java TextView()从活动更改为片段时为null_Java_Android_Android Studio_Android Activity_Android Fragmentactivity - Fatal编程技术网

Java TextView()从活动更改为片段时为null

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

到目前为止,当我运行与活动相同的应用程序时,错误在粗体文本行中,它正确地给出了输出,但在片段中,它生成了null并抛出null指针异常

下面是调试映像

活跃

零碎

以下是AlarmTimePickerDialog类中的showtime方法:

    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
 }