取消日历应用程序中的完成button – 它是否是操作栏的一部分?

Google日历应用

嗨,我引用日历应用程序中的取消/完成button。 这两个button固定在顶部,即使滚动底部“窗体”,它们也始终可见。

我可以知道,是否是Action Bar的一部分? 如果是这样,那么实现应该如何呢?

Solutions Collecting From Web of "取消日历应用程序中的完成button – 它是否是操作栏的一部分?"

请记住,Android是开源的,预装在运行aosp的android设备上的大多数应用程序都是开源的。

这是项目: https : //github.com/android/platform_packages_apps_calendar

是的,这是一个自定义的ActionBar设置,这里是XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:divider="?android:attr/dividerVertical" android:dividerPadding="12dip android:showDividers="middle"> <!-- id must match corresponding menu item id --> <LinearLayout android:id="@+id/action_cancel style="@style/EditEventCustomActionButton"> <ImageView android:src="@drawable/ic_menu_cancel_holo_light" style="@style/EditEventCustomActionButtonImage" /> <TextView android:text="@string/discard_label" style="@style/EditEventCustomActionButtonText" /> </LinearLayout> <!-- id must match corresponding menu item id --> <LinearLayout android:id="@+id/action_done" style="@style/EditEventCustomActionButton"> <ImageView android:src="@drawable/ic_menu_done_holo_light" style="@style/EditEventCustomActionButtonImage" /> <TextView android:text="@string/save_label" style="@style/EditEventCustomActionButtonText" /> </LinearLayout </LinearLayout> 

稍后在运行时设置:

 View actionBarButtons = inflater.inflate(R.layout.edit_event_custom_actionbar, new LinearLayout(mContext), false); View cancelActionView = actionBarButtons.findViewById(R.id.action_cancel); cancelActionView.setOnClickListener(mActionBarListener); View doneActionView = actionBarButtons.findViewById(R.id.action_done); doneActionView.setOnClickListener(mActionBarListener); mContext.getActionBar().setCustomView(actionBarButtons); 

希望有所帮助

为了共享…为了实现一个sherlock片段,所使用的LayoutInflater是来自oncreateView方法的一个:

  setHasOptionsMenu(true); View actionBarButtons = inflater.inflate(R.layout.edit_event_custom_actionbar, new LinearLayout(getActivity()), false); View cancelActionView = actionBarButtons.findViewById(R.id.action_cancel); cancelActionView.setOnClickListener(mActionBarListener); View doneActionView = actionBarButtons.findViewById(R.id.action_done); doneActionView.setOnClickListener(mActionBarListener); getSherlockActivity().getSupportActionBar().setHomeButtonEnabled(false); getSherlockActivity().getSupportActionBar().setDisplayShowHomeEnabled(false); getSherlockActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSherlockActivity().getSupportActionBar().setDisplayShowTitleEnabled(false); getSherlockActivity().getSupportActionBar().setDisplayShowCustomEnabled(true); getSherlockActivity().getSupportActionBar().setCustomView(actionBarButtons); 

操作栏监听器的位置

 private final View.OnClickListener mActionBarListener = new View.OnClickListener() { @Override public void onClick(View v) { onActionBarItemSelected(v.getId()); } }; private boolean onActionBarItemSelected(int itemId) { switch (itemId) { case R.id.action_done: save(); break; case R.id.action_cancel: System.err.println("cancel"); getActivity().onBackPressed(); break; } return true; } 

和以前的post是一样的:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:divider="?android:attr/dividerVertical" android:dividerPadding="12dip android:showDividers="middle"> <!-- id must match corresponding menu item id --> <LinearLayout android:id="@+id/action_cancel style="@style/EditEventCustomActionButton"> <ImageView android:src="@drawable/ic_menu_cancel_holo_light" style="@style/EditEventCustomActionButtonImage" /> <TextView android:text="@string/discard_label" style="@style/EditEventCustomActionButtonText" /> </LinearLayout> <!-- id must match corresponding menu item id --> <LinearLayout android:id="@+id/action_done" style="@style/EditEventCustomActionButton"> <ImageView android:src="@drawable/ic_menu_done_holo_light" style="@style/EditEventCustomActionButtonImage" /> <TextView android:text="@string/save_label" style="@style/EditEventCustomActionButtonText" /> </LinearLayout </LinearLayout> 

基于daniel_c05的回答,我能够在我的应用程序中得到这个工作,但是我需要一些额外的步骤,没有在任何现有的答案中logging,以使其正常工作。

1)您将需要检索布局本身,引用下面的缓解,最初来自: https : //github.com/android/platform_packages_apps_calendar/blob/master/res/layout/edit_event_custom_actionbar.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:divider="?android:attr/dividerVertical" android:dividerPadding="12dip android:showDividers="middle"> <!-- id must match corresponding menu item id --> <LinearLayout android:id="@+id/action_cancel style="@style/EditEventCustomActionButton"> <ImageView android:src="@drawable/ic_menu_cancel_holo_light" style="@style/EditEventCustomActionButtonImage" /> <TextView android:text="@string/discard_label" style="@style/EditEventCustomActionButtonText" /> </LinearLayout> <!-- id must match corresponding menu item id --> <LinearLayout android:id="@+id/action_done" style="@style/EditEventCustomActionButton"> <ImageView android:src="@drawable/ic_menu_done_holo_light" style="@style/EditEventCustomActionButtonImage" /> <TextView android:text="@string/save_label" style="@style/EditEventCustomActionButtonText" /> </LinearLayout> </LinearLayout> 

2)你也将需要样式来与它,引用下面的缓解,原来是: https : //github.com/android/platform_packages_apps_calendar/blob/master/res/values/styles.xml

 <style name="EditEventCustomActionButton" parent="android:style/Widget.Holo.Light.ActionButton"> <item name="android:layout_height">match_parent</item> <item name="android:layout_width">0dp</item> <item name="android:layout_weight">1</item> <item name="android:focusable">true</item> <item name="android:orientation">horizontal</item> </style> <style name="EditEventCustomActionButtonImage"> <item name="android:layout_height">wrap_content</item> <item name="android:layout_width">wrap_content</item> <item name="android:padding">4dp</item> </style> <style name="EditEventCustomActionButtonText"> <item name="android:layout_height">wrap_content</item> <item name="android:layout_width">wrap_content</item> <item name="android:textAppearance">?android:attr/actionMenuTextAppearance</item> <item name="android:textColor">?android:attr/actionMenuTextColor</item> <item name="android:orientation">horizontal</item> <item name="android:singleLine">true</item> <item name="android:ellipsize">none</item> <item name="android:padding">4dp</item> </style> 

3)您还需要抓住buttondrawables,或者用自己的replace它们,它们在这里的各种可绘制的文件夹中可用: https : //github.com/android/platform_packages_apps_calendar/tree/master/res

4)现在唯一缺less的是你可以在上面的链接中find的string资源,尽pipe我用自己已经定义的replace了它们。

5)为了使它正确地工作,我不得不做一点点膨胀它。 下面是我不得不放在OnCreate工作的最低金额。 我正在和Xamarin合作,但是我已经放了Java和Xamarin版本。 公正的警告:我没有testing过Java版本。

Java的

 // Inflate the custom view and add click handlers for the buttons View actionBarButtons = inflater.inflate(R.layout.edit_event_custom_actionbar, new LinearLayout(mContext), false); View cancelActionView = actionBarButtons.findViewById(R.id.action_cancel); cancelActionView.setOnClickListener(mActionBarListener); View doneActionView = actionBarButtons.findViewById(R.id.action_done); doneActionView.setOnClickListener(mActionBarListener); // Retrieve an instance of the Activity's ActionBar ActionBar actionBar = mContext.getActionBar(); // Hide the icon, title and home/up button actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayHomeAsUpEnabled(false); actionBar.setDisplayShowTitleEnabled(false); // Set the custom view and allow the bar to show it actionBar.setCustomView(actionBarButtons); actionBar.setDisplayShowCustomEnabled(true); 

Xamarin C#

 // Inflate layout for custom action bar with save & cancel buttons var actionBarLayout = (LinearLayout)LayoutInflater.Inflate( Resource.Layout.ActionBarSave, new LinearLayout(BaseContext), false); var saveButton = actionBarLayout.FindViewById<LinearLayout (Resource.Id.action_done); saveButton.Click += saveButton_Click; var cancelButton = actionBarLayout.FindViewById<LinearLayout>(Resource.Id.action_cancel); cancelButton.Click += cancelButton_Click; // Hide the icon, title and home/up button ActionBar.SetDisplayShowHomeEnabled(false); ActionBar.SetDisplayHomeAsUpEnabled(false); ActionBar.SetDisplayShowTitleEnabled(false); // Set the custom view and allow the bar to show it var layoutParams = new ActionBar.LayoutParams( ActionBar.LayoutParams.MatchParent, ActionBar.LayoutParams.MatchParent); ActionBar.SetCustomView(actionBarLayout, layoutParams); ActionBar.SetDisplayShowCustomEnabled(true); 

这就是我所需要的一切。 我试图尽可能全面,希望这可以节省一些人从Googlesearch尝试find其他答案失踪的步骤。