在 Navigation Drawer 中的 Fragment 中管理线程(用于流畅的动画)
Managing Threads in Fragment inside Navigation Drawer (for smooth animation)
想问问大家有没有和我一样的问题
I/art: Do partial code cache collection, code=250KB, data=130KB
I/art: After code cache collection, code=248KB, data=129KB
I/art: Increasing code cache capacity to 1024KB
I/Choreographer: Skipped 143 frames! The application may be doing too much work on its main thread.
我的 Android 应用程序的设计很简单,我的着陆页中有一个 Navigation Drawer 然后我有 Multiple Fragments 在每个抽屉项目中...所以这意味着我仅在使用 NavDrawer 的着陆页上使用 Activity。
当我尝试在我的每个片段上添加 public 存储库,如 calendar,recycler views 时,我收到上述错误。
我在网上阅读了一些文章和示例,发现我应该使用 AsyncTask<> 或 运行OnUIThread 和运行 operations 与主 Thread/UI 线程分离。尽管我试图在我的片段上应用这些线程,但我得到了同样的错误。
但是 操作 并不是很重,我只是加载了日历库并在我的片段中的 onCreateView 上实例化它们...
我希望你能给我一些建议或最佳实践来管理这种情况...我知道有人遇到过同样的问题。呵呵。提前致谢。
I tried this link, but it is more likely another scenario
代码要求:
public class CalendarFragment extends Fragment implements
RobotoCalendarView.RobotoCalendarListener,
CalendarListAdapter.OnItemClickListener
// CalendarListAdapter.CallbackInterface // Should Implemented on the Main thread/Activity if used as fragment
{
private RobotoCalendarView robotoCalendarView;
private Context context;
private CalendarListAdapter mListAdapter;
private RecyclerView mSearchResultsList;
private static final int REQUEST_CODE = 1234;
private List<ServiceJobWrapper> results = null;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = /*(View)*/ inflater.inflate(
R.layout.calendar_activity, container, false);
setContext(container.getContext());
/**NOTE FROM HERE**/
setUpCalendarView(view);
// UICalendarLibTask mCalendarTask = new UICalendarLibTask(view);
// mCalendarTask.execute((Void) null);
/* setUpRecyclerView(view);
setupResultsList(view);
if (results == null) {
//final View view = v;
*//*new Thread(new Runnable() {
public void run() {
populateCardList();
}
}).start();*//*
UITask mAuthTask = new UITask();
mAuthTask.execute((Void) null);
// populateCardList();
}*/
return view;
}
/*@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("CalendarFragment:", "I'm on the onCreate");
}*/
/**
* These Two Lines should be included on every Fragment to maintain the state and donnot load again
*
* @param outState
*/
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
setRetainInstance(true);
Log.d("CalendarFragment: ", "I'm on the onSaveInstanceState");
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (results == null) { // If Data is Null then fetch the Data List again
// UpdateJobServiceTask task = new UpdateJobServiceTask(this.getView());
// task.execute("");
//populateCardList();
} else { // Restore the Data List again
mListAdapter.swapData(results);
}
Log.d("CalendarFragment: ", "I'm on the onActivityCreated");
}
private void setContext(Context c) {
this.context = c;
}
public void setUpRecyclerView(View upRecyclerView) {
mSearchResultsList = (RecyclerView) upRecyclerView.findViewById(R.id.calendar_service_job_list);
}
public void setupResultsList(View view) {
mListAdapter = new CalendarListAdapter(view.getContext());
mSearchResultsList.setAdapter(mListAdapter);
mSearchResultsList.setLayoutManager(new LinearLayoutManager(view.getContext()));
}
/**
* Set up the Calendar View Listener on Click of the Date/Month
*
* @param view
*/
private void setUpCalendarView(View view) {
// Gets the calendar from the view
robotoCalendarView = (RobotoCalendarView) view.findViewById(R.id.robotoCalendarPicker);
Button markDayButton = (Button) view.findViewById(R.id.markDayButton);
markDayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar calendar = Calendar.getInstance();
Random random = new Random(System.currentTimeMillis());
int style = random.nextInt(2);
int daySelected = random.nextInt(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.DAY_OF_MONTH, daySelected);
switch (style) {
case 0:
robotoCalendarView.markCircleImage1(calendar);
break;
case 1:
robotoCalendarView.markCircleImage2(calendar);
break;
default:
break;
}
}
});
// Set listener, in this case, the same activity
robotoCalendarView.setRobotoCalendarListener(this);
robotoCalendarView.setShortWeekDays(false);
robotoCalendarView.showDateTitle(true);
robotoCalendarView.updateView();
}
// @Override
// protected void attachBaseContext(Context newBase) {
// super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
// }
/*@Override
public void onAttach(Context context) {
super.onAttach(context);
//super.onAttach(CalligraphyContextWrapper.wrap(context));
}*/
@Override
public void onDayClick(Calendar daySelectedCalendar) {
Log.d("onDayClick: ", daySelectedCalendar.getTime() + "");
}
@Override
public void onDayLongClick(Calendar daySelectedCalendar) {
Log.d("onDayLongClick: ", daySelectedCalendar.getTime() + "");
}
@Override
public void onRightButtonClick() { Log.d("onRightButtonClick!", "Calendar"); }
@Override
public void onLeftButtonClick() {
Log.d("onLeftButtonClick!", "Calendar");
// Toast.makeText(this.context, "onLeftButtonClick!", Toast.LENGTH_SHORT).show();
}
private void activityResultIntent() {
Intent check = new Intent();
startActivityForResult(check, REQUEST_CODE);
}
/**
* Setting up for the Result OnClick inside the CardView on the List Adapter
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case RESULT_OK:
/*if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
System.out.println("I'm in onActivityResult");
_speaker = new Speaker(getApplicationContext());
ImageButton buttonSpeakKoreanAlphabet = (ImageButton) findViewById(R.id.buttonSpeakKorean_alphabet);
buttonSpeakKoreanAlphabet.setClickable(true);
} else {
Intent install = new Intent();
install.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(install);
}*/
break;
case RESULT_CANCELED:
// ... Handle this situation
break;
default:
break;
}
}
private void populateCardList() {
// Data to be Fetch to the CardView
// List<ServiceJobWrapper> results = null;//getAllData(this.getContext());
/*new UIThreadHandler(getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
}
});*/
results = getAllDetailsOfLetters();
mSearchResultsList.setHasFixedSize(true);
mSearchResultsList.setLayoutManager(new LinearLayoutManager(context));
mSearchResultsList.setItemAnimator(new DefaultItemAnimator());
mListAdapter.swapData(results);
}
private class UpdateJobServiceTask extends AsyncTask<String, Void, String> {
private View mView;
public UpdateJobServiceTask(View view) {
mView = view;
}
@Override
protected String doInBackground(String... params) {
populateCardList();
return null;
}
@Override
protected void onPostExecute(String result) {
//textView.setText(result);
}
}
/***********************************
* TEST *
***********************************/
// Getting Details Data of all ALPHABET
public List<ServiceJobWrapper> getAllDetailsOfLetters() {
ArrayList<ServiceJobWrapper> translationList = new ArrayList<>();
int x = 0;
do {
ServiceJobWrapper alpha = new ServiceJobWrapper();
alpha.setID(Integer.parseInt(x + ""));
alpha.setDay(x + "");
alpha.setDate("TestDate" + x);
alpha.setServiceNumber("00" + x);
alpha.setCustomer("Customer" + x);
alpha.setEngineer("Engineer" + x);
alpha.setStatus((x % 2 == 1) ? "Pending" : "Completed");
translationList.add(alpha);
x++;
} while (x != 10);
return translationList;
}
@Override
public void onClick(ServiceJobWrapper colorWrapper) {
}
/**
* Represents an asynchronous Task
* UITask mAuthTask = new UITask();
mAuthTask.execute((Void) null);
*/
public class UITask extends AsyncTask<Void, Void, Boolean> {
UITask() {
}
@Override
protected Boolean doInBackground(Void... params) {
// TODO: attempt authentication against a network service.
/*try {
// Simulate network access.
Thread.sleep(2000);
// init_DrawerNav();
//populateCardList();
} catch (InterruptedException e) {
return false;
}*/
results = getAllDetailsOfLetters();
// TODO: register the new account here.
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
mSearchResultsList.setHasFixedSize(true);
mSearchResultsList.setLayoutManager(new LinearLayoutManager(context));
mSearchResultsList.setItemAnimator(new DefaultItemAnimator());
mListAdapter.swapData(results);
}
@Override
protected void onCancelled() {
}
}
public class UICalendarLibTask extends AsyncTask<Void, Void, Boolean> {
private View view;
UICalendarLibTask(View v) {
this.view = v;
}
@Override
protected Boolean doInBackground(Void... params) {
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
setUpCalendarView(view);
}
@Override
protected void onCancelled() {
}
}
}
在 onCreateView 上调用此方法相同的结果:
setUpCalendarView(view); // First try without asynTask
// Second try with asynTask
// UICalendarLibTask mCalendarTask = new UICalendarLibTask(view);
// mCalendarTask.execute((Void) null);
这是我的 XML 片段布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20sp"
android:background="@drawable/background">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frameLayoutCalendar">
<com.marcohc.robotocalendar.RobotoCalendarView
android:id="@+id/robotoCalendarPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:id="@+id/frameLayoutButton"
android:layout_height="wrap_content">
<Button
android:text="TEST RANDOM"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/markDayButton" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:isScrollContainer="true"
android:id="@+id/frameLayoutListOfServices">
<android.support.v7.widget.RecyclerView
android:id="@+id/calendar_service_job_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:clipToPadding="false"
android:paddingTop="60dp" />
</FrameLayout>
好吧,我的线程没有看到任何错误,尤其是在填充 cardview 时,但是,当我尝试在同一个 Fragment 上同时呈现 recyclerView 和 Calendar 时,我得到了上面的错误
注意:
我正在使用来自 github 的这个 repo 作为日历视图
RobotoCalendar Github
我不明白我的解决方案背后的奥秘,但这解决了我的问题...
之前
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20sp"
android:background="@drawable/background">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frameLayoutCalendar">
<com.marcohc.robotocalendar.RobotoCalendarView
android:id="@+id/robotoCalendarPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
AFTER(我刚刚删除了行 android:background="@drawable/background"
)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20sp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frameLayoutCalendar">
<com.marcohc.robotocalendar.RobotoCalendarView
android:id="@+id/robotoCalendarPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
谁能给我解释一下这种情况...
我真的不需要设置我的布局背景,为了没有这个 Choreagrapher 错误,谢谢!
我也希望有人能帮忙,
想问问大家有没有和我一样的问题
I/art: Do partial code cache collection, code=250KB, data=130KB
I/art: After code cache collection, code=248KB, data=129KB
I/art: Increasing code cache capacity to 1024KB
I/Choreographer: Skipped 143 frames! The application may be doing too much work on its main thread.
我的 Android 应用程序的设计很简单,我的着陆页中有一个 Navigation Drawer 然后我有 Multiple Fragments 在每个抽屉项目中...所以这意味着我仅在使用 NavDrawer 的着陆页上使用 Activity。
当我尝试在我的每个片段上添加 public 存储库,如 calendar,recycler views 时,我收到上述错误。
我在网上阅读了一些文章和示例,发现我应该使用 AsyncTask<> 或 运行OnUIThread 和运行 operations 与主 Thread/UI 线程分离。尽管我试图在我的片段上应用这些线程,但我得到了同样的错误。
但是 操作 并不是很重,我只是加载了日历库并在我的片段中的 onCreateView 上实例化它们...
我希望你能给我一些建议或最佳实践来管理这种情况...我知道有人遇到过同样的问题。呵呵。提前致谢。
I tried this link, but it is more likely another scenario
代码要求:
public class CalendarFragment extends Fragment implements
RobotoCalendarView.RobotoCalendarListener,
CalendarListAdapter.OnItemClickListener
// CalendarListAdapter.CallbackInterface // Should Implemented on the Main thread/Activity if used as fragment
{
private RobotoCalendarView robotoCalendarView;
private Context context;
private CalendarListAdapter mListAdapter;
private RecyclerView mSearchResultsList;
private static final int REQUEST_CODE = 1234;
private List<ServiceJobWrapper> results = null;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = /*(View)*/ inflater.inflate(
R.layout.calendar_activity, container, false);
setContext(container.getContext());
/**NOTE FROM HERE**/
setUpCalendarView(view);
// UICalendarLibTask mCalendarTask = new UICalendarLibTask(view);
// mCalendarTask.execute((Void) null);
/* setUpRecyclerView(view);
setupResultsList(view);
if (results == null) {
//final View view = v;
*//*new Thread(new Runnable() {
public void run() {
populateCardList();
}
}).start();*//*
UITask mAuthTask = new UITask();
mAuthTask.execute((Void) null);
// populateCardList();
}*/
return view;
}
/*@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("CalendarFragment:", "I'm on the onCreate");
}*/
/**
* These Two Lines should be included on every Fragment to maintain the state and donnot load again
*
* @param outState
*/
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
setRetainInstance(true);
Log.d("CalendarFragment: ", "I'm on the onSaveInstanceState");
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (results == null) { // If Data is Null then fetch the Data List again
// UpdateJobServiceTask task = new UpdateJobServiceTask(this.getView());
// task.execute("");
//populateCardList();
} else { // Restore the Data List again
mListAdapter.swapData(results);
}
Log.d("CalendarFragment: ", "I'm on the onActivityCreated");
}
private void setContext(Context c) {
this.context = c;
}
public void setUpRecyclerView(View upRecyclerView) {
mSearchResultsList = (RecyclerView) upRecyclerView.findViewById(R.id.calendar_service_job_list);
}
public void setupResultsList(View view) {
mListAdapter = new CalendarListAdapter(view.getContext());
mSearchResultsList.setAdapter(mListAdapter);
mSearchResultsList.setLayoutManager(new LinearLayoutManager(view.getContext()));
}
/**
* Set up the Calendar View Listener on Click of the Date/Month
*
* @param view
*/
private void setUpCalendarView(View view) {
// Gets the calendar from the view
robotoCalendarView = (RobotoCalendarView) view.findViewById(R.id.robotoCalendarPicker);
Button markDayButton = (Button) view.findViewById(R.id.markDayButton);
markDayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar calendar = Calendar.getInstance();
Random random = new Random(System.currentTimeMillis());
int style = random.nextInt(2);
int daySelected = random.nextInt(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.DAY_OF_MONTH, daySelected);
switch (style) {
case 0:
robotoCalendarView.markCircleImage1(calendar);
break;
case 1:
robotoCalendarView.markCircleImage2(calendar);
break;
default:
break;
}
}
});
// Set listener, in this case, the same activity
robotoCalendarView.setRobotoCalendarListener(this);
robotoCalendarView.setShortWeekDays(false);
robotoCalendarView.showDateTitle(true);
robotoCalendarView.updateView();
}
// @Override
// protected void attachBaseContext(Context newBase) {
// super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
// }
/*@Override
public void onAttach(Context context) {
super.onAttach(context);
//super.onAttach(CalligraphyContextWrapper.wrap(context));
}*/
@Override
public void onDayClick(Calendar daySelectedCalendar) {
Log.d("onDayClick: ", daySelectedCalendar.getTime() + "");
}
@Override
public void onDayLongClick(Calendar daySelectedCalendar) {
Log.d("onDayLongClick: ", daySelectedCalendar.getTime() + "");
}
@Override
public void onRightButtonClick() { Log.d("onRightButtonClick!", "Calendar"); }
@Override
public void onLeftButtonClick() {
Log.d("onLeftButtonClick!", "Calendar");
// Toast.makeText(this.context, "onLeftButtonClick!", Toast.LENGTH_SHORT).show();
}
private void activityResultIntent() {
Intent check = new Intent();
startActivityForResult(check, REQUEST_CODE);
}
/**
* Setting up for the Result OnClick inside the CardView on the List Adapter
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case RESULT_OK:
/*if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
System.out.println("I'm in onActivityResult");
_speaker = new Speaker(getApplicationContext());
ImageButton buttonSpeakKoreanAlphabet = (ImageButton) findViewById(R.id.buttonSpeakKorean_alphabet);
buttonSpeakKoreanAlphabet.setClickable(true);
} else {
Intent install = new Intent();
install.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(install);
}*/
break;
case RESULT_CANCELED:
// ... Handle this situation
break;
default:
break;
}
}
private void populateCardList() {
// Data to be Fetch to the CardView
// List<ServiceJobWrapper> results = null;//getAllData(this.getContext());
/*new UIThreadHandler(getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
}
});*/
results = getAllDetailsOfLetters();
mSearchResultsList.setHasFixedSize(true);
mSearchResultsList.setLayoutManager(new LinearLayoutManager(context));
mSearchResultsList.setItemAnimator(new DefaultItemAnimator());
mListAdapter.swapData(results);
}
private class UpdateJobServiceTask extends AsyncTask<String, Void, String> {
private View mView;
public UpdateJobServiceTask(View view) {
mView = view;
}
@Override
protected String doInBackground(String... params) {
populateCardList();
return null;
}
@Override
protected void onPostExecute(String result) {
//textView.setText(result);
}
}
/***********************************
* TEST *
***********************************/
// Getting Details Data of all ALPHABET
public List<ServiceJobWrapper> getAllDetailsOfLetters() {
ArrayList<ServiceJobWrapper> translationList = new ArrayList<>();
int x = 0;
do {
ServiceJobWrapper alpha = new ServiceJobWrapper();
alpha.setID(Integer.parseInt(x + ""));
alpha.setDay(x + "");
alpha.setDate("TestDate" + x);
alpha.setServiceNumber("00" + x);
alpha.setCustomer("Customer" + x);
alpha.setEngineer("Engineer" + x);
alpha.setStatus((x % 2 == 1) ? "Pending" : "Completed");
translationList.add(alpha);
x++;
} while (x != 10);
return translationList;
}
@Override
public void onClick(ServiceJobWrapper colorWrapper) {
}
/**
* Represents an asynchronous Task
* UITask mAuthTask = new UITask();
mAuthTask.execute((Void) null);
*/
public class UITask extends AsyncTask<Void, Void, Boolean> {
UITask() {
}
@Override
protected Boolean doInBackground(Void... params) {
// TODO: attempt authentication against a network service.
/*try {
// Simulate network access.
Thread.sleep(2000);
// init_DrawerNav();
//populateCardList();
} catch (InterruptedException e) {
return false;
}*/
results = getAllDetailsOfLetters();
// TODO: register the new account here.
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
mSearchResultsList.setHasFixedSize(true);
mSearchResultsList.setLayoutManager(new LinearLayoutManager(context));
mSearchResultsList.setItemAnimator(new DefaultItemAnimator());
mListAdapter.swapData(results);
}
@Override
protected void onCancelled() {
}
}
public class UICalendarLibTask extends AsyncTask<Void, Void, Boolean> {
private View view;
UICalendarLibTask(View v) {
this.view = v;
}
@Override
protected Boolean doInBackground(Void... params) {
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
setUpCalendarView(view);
}
@Override
protected void onCancelled() {
}
}
}
在 onCreateView 上调用此方法相同的结果:
setUpCalendarView(view); // First try without asynTask
// Second try with asynTask
// UICalendarLibTask mCalendarTask = new UICalendarLibTask(view);
// mCalendarTask.execute((Void) null);
这是我的 XML 片段布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20sp"
android:background="@drawable/background">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frameLayoutCalendar">
<com.marcohc.robotocalendar.RobotoCalendarView
android:id="@+id/robotoCalendarPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:id="@+id/frameLayoutButton"
android:layout_height="wrap_content">
<Button
android:text="TEST RANDOM"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/markDayButton" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:isScrollContainer="true"
android:id="@+id/frameLayoutListOfServices">
<android.support.v7.widget.RecyclerView
android:id="@+id/calendar_service_job_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:clipToPadding="false"
android:paddingTop="60dp" />
</FrameLayout>
好吧,我的线程没有看到任何错误,尤其是在填充 cardview 时,但是,当我尝试在同一个 Fragment 上同时呈现 recyclerView 和 Calendar 时,我得到了上面的错误
注意: 我正在使用来自 github 的这个 repo 作为日历视图 RobotoCalendar Github
我不明白我的解决方案背后的奥秘,但这解决了我的问题...
之前
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20sp"
android:background="@drawable/background">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frameLayoutCalendar">
<com.marcohc.robotocalendar.RobotoCalendarView
android:id="@+id/robotoCalendarPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
AFTER(我刚刚删除了行 android:background="@drawable/background"
)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20sp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frameLayoutCalendar">
<com.marcohc.robotocalendar.RobotoCalendarView
android:id="@+id/robotoCalendarPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
谁能给我解释一下这种情况... 我真的不需要设置我的布局背景,为了没有这个 Choreagrapher 错误,谢谢!
我也希望有人能帮忙,