10

谷歌日历应用

嗨,我指的是日历应用程序中的取消/完成按钮。这 2 个按钮固定在顶部,即使您滚动底部的“表单”,它们也始终可见。

我可以知道,它是 Action Bar 的一部分吗?如果是这样,实现应该如何?

4

3 回答 3

15

请记住,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);

希望有帮助

于 2013-02-27T04:32:59.773 回答
8

只是为了分享......为了实现一个夏洛克片段,使用的 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;
}

并且布局与之前的帖子相同:

<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>
于 2013-07-15T21:52:15.783 回答
3

根据 daniel_c05 的回答,我能够在我的应用程序中使用它,但是我需要一些额外的步骤,这些步骤在任何一个现有答案中都没有记录,以使其正常工作。

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)您还需要获取按钮drawables,或者用您自己的替换它们,它们可以在此处的各种drawable文件夹中找到: https ://github.com/android/platform_packages_apps_calendar/tree/master/res

4) 现在唯一缺少的是您可以在上面的链接中找到的字符串资源,尽管我只是用我已经定义的自己替换了它们。

5)要真正让它正常工作,我必须做的不仅仅是给它充气。以下是我必须在 OnCreate 中投入的最低金额才能使其正常工作。我正在使用 Xamarin,但为了方便起见,我已经放了 Java 和 Xamarin 版本。公平警告:我还没有测试 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);

这就是我让它工作所需要的一切。我试图尽可能全面,希望这将使某人免于使用谷歌搜索来尝试找到其他答案中缺少的步骤。

于 2015-05-19T16:29:20.657 回答