【问题标题】:Compatibility between AppCompat and AndroidxAppCompat 和 Androidx 之间的兼容性
【发布时间】:2019-12-27 12:42:20
【问题描述】:

我需要从我的片段中创建一个 DatePeriodPicker,如下所示:

要创建日期期间对话框,我需要使用方法 .show(); 在这个方法中,我需要传递一个fragmentManager。

                DatePickerDialog dpd = DatePickerDialog.newInstance(
                        Fragment_Details.this,
                        1999,
                        3-1,
                        2,2000,2-1,3
                );
                dpd.setYearRange(2000,2020);
                Calendar max_calendar = Calendar.getInstance();
                dpd.setMaxDate(max_calendar);
                dpd.show(getFragmentManager(),"P")

我的项目已经迁移到androidX,所以每当我传递一个片段管理器时,它就会传递一个androidx片段管理器:(来自我的项目)

import androidx.fragment.app.Fragment;

但是,位于我尝试使用的库中的类中的方法 .show() 使用此导入:

import android.app.Fragment;

我尝试创建一个 java 类,扩展 appcompat 活动并将 fragmentmanager(android.app.Fragment) 传递给方法 .show()。该方法识别出片段管理器来自(AppCompat)但是它可能在我从我的片段创建此类的新实例后立即崩溃。

这是我崩溃时的日志:

D/ViewRootImpl@13a430d[PopupWindow:c0edac8]: ViewPostIme pointer 1
D/AbsListView: onTouchUp() mTouchMode : 0
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mybimpos, PID: 19385
    java.lang.IllegalStateException: Activity has been destroyed
        at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1901)
        at android.app.BackStackRecord.commitInternal(BackStackRecord.java:688)
        at android.app.BackStackRecord.commit(BackStackRecord.java:646)
        at android.app.DialogFragment.show(DialogFragment.java:233)
        at com.example.mybimpos.Dialog_attemp_2.<init>(Dialog_attemp_2.java:17)
        at com.example.mybimpos.Fragment_Reports_Details$2.onItemSelected(Fragment_Reports_Details.java:802)
        at org.angmarch.views.NiceSpinner$2.onItemClick(NiceSpinner.java:177)
        at android.widget.AdapterView.performItemClick(AdapterView.java:350)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1683)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:4094)
        at android.widget.AbsListView$10.run(AbsListView.java:6583)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

这是我为尝试传递 appcompat 片段管理器而创建的类:

public class Dialog_attemp_2 extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
    public Dialog_attemp_2() {
        DatePickerDialog dpd = DatePickerDialog.newInstance(
                Dialog_attemp_2.this,
                1999,
                3-1,
                2,2000,2-1,3
        );
        dpd.setYearRange(2000,2020);
        Calendar max_calendar = Calendar.getInstance();
        dpd.setMaxDate(max_calendar);
        dpd.show(getFragmentManager(),"pierre");
    }
    @Override
    public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth, int yearEnd, int monthOfYearEnd, int dayOfMonthEnd) {

    }

}

我从我的片段中调用这个类:

new Dialog_attemp_2();

【问题讨论】:

  • 发布您的 logcat 错误
  • 你应该启用jetifier
  • 我已经启用了jetifier:android.enableJetifier=true

标签: android material-design androidx android-datepicker material-components-android


【解决方案1】:

使用 androidx,您可以使用 DatePickerDialog 的实例定义 DialogFragment

import androidx.fragment.app.DialogFragment;

public static class DatePickerFragment extends DialogFragment
                            implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
    }
}

然后调用它:

DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");

选项 2:新材质组件

通过Material Components for Android,您可以使用新的MaterialDatePicker

目前正在积极开发中,需要1.1.0版本的材料组件用于android库。

implementation 'com.google.android.material:material:1.1.0-alpha09'

要选择单个日期,只需使用:

       MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();
       builder.setTitleText(R.string.your_text);
       MaterialDatePicker<Long> picker = builder.build();
       picker.show(getSupportFragmentManager(), picker.toString());

要选择范围日期,您可以使用 DateRange Picker:

MaterialDatePicker.Builder<Pair<Long, Long>> builder =
                    MaterialDatePicker.Builder.dateRangePicker();
                CalendarConstraints.Builder constraintsBuilder = new CalendarConstraints.Builder();                                        builder.setCalendarConstraints(constraintsBuilder.build());
                MaterialDatePicker<?> picker = builder.build();
                picker.show(getSupportFragmentManager(), picker.toString());

【讨论】:

  • 您好,您的方法有效,但我的帖子中并不清楚。 DatePeriodDialog 类来自一个库,我发布了一张我从使用它获得的对话框的图片。所以在我的情况下,android 的日期选择器对我没有用,因为我需要一个期间选择器,而不仅仅是一个日期选择器。
  • @PierreKhoury 对不起,我没注意到。在这种情况下,您应该检查 DatePeriodPicker 库是否支持 androidx。无论如何,我刚刚添加了一个新的 sn-p,因为新的材质组件还支持范围选择器。
  • 它确实支持androidx!我碰巧非常喜欢它的外观和感觉。谢谢兄弟!
【解决方案2】:

如果你真的需要使用这个fragmentmanager你可以添加app compat依赖

添加gradle依赖:

"implementation 'androidx.appcompat:appcompat:1.0.2'"

并从 AppCompatActivity 扩展您的活动。然后将 getFragmentManager() 改为 getSupportFragmentManager()。

【讨论】:

  • 我试过了,我在 Dialog_attemp_2 java 类中将 getFragmentManager() 更改为 getSupportFragmentManager()。但是,当我将 getSupportFragmentManager() 传递给 .show() 方法时,出现此错误:无法解析方法 'show(androidx.fragment.app.FragmentManager, java.lang.String)
  • 使用 AppCompatActivity?
猜你喜欢
  • 2020-04-08
  • 2019-07-17
  • 1970-01-01
  • 2017-03-27
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多