小编Rya*_*yan的帖子

将应用栏滚动视图行为添加到CoordinatorLayout中的多个视图

我希望将滚动支持添加到一个单独的,可滚动的,子视图CoordinatorLayout与an AppBarLayoutCollapsingToolbarLayout.滚动RecyclerViewAppBarLayout(下面的压缩代码)时,应用栏及其内容成功滚动和折叠.但是,当尝试在LinearLayout上面启动滚动事件时RecyclerView,没有任何反应,因为LinearLayout不知道滚动或折叠视图.

我们的目标是将该LinearLayout行为作为一个粘性页眉,并且RecyclerView与该页脚AppBarLayout接收相同的滚动行为RecyclerView,类似于Spotify的随机播放/可用离线标题.事实上,如果appbar_scrolling_view_behavior layout_behavior可以应用于LinearLayout类似的,那将是很好的RecyclerView,但我想在不可滚动的视图上忽略了该行为.是否有人知道这种解决方法,不需要将LinearLayout视图作为一行实现RecyclerView

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="@dimen/collapsible_app_bar_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/gradient_banner"
            app:contentScrim="@color/background_content_frame"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/image_header"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/some_image"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/collapsible_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:layout_collapseMode="pin"/>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/slide_handle_height"
        android:orientation="horizontal"
        android:background="@color/slide_handle"
        android:gravity="center_vertical">

        <!-- three buttons …
Run Code Online (Sandbox Code Playgroud)

android androiddesignsupport android-coordinatorlayout android-collapsingtoolbarlayout android-appbarlayout

39
推荐指数
4
解决办法
7万
查看次数

使用GSON调整改造响应

我希望通过从特定API收到的每个成功响应,以非常方式检索已知JSON对象的子元素.

每个服务器响应都返回以下JSON格式(为简单起见,精简):

{
    "status": "success",
    "error_title": "",
    "error_message": "",
    "data": {
        "messages": [
            { "message_id": "123",
              "content": "This is a message" },
            { "message_id": "124",
              "content": "This is another message" }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

错误响应包含相同的通用格式,"data"对象为空,错误相关的JSON对象包含有用的值.在出现错误的情况下,我想提取与错误相关的JSON对象.

通过上面的响应,我有一个MessageResponse包含status,errorTitle和errorMessage String属性的类以及一个MessageData对象.MessageData然后该对象包含一个消息列表 - List<Message> messages.在这种情况下获取消息的我的GET方法如下(为简单起见,简化):

@GET("/chat/conversation")
void getMessages(Callback<MessageResponse> callback);
Run Code Online (Sandbox Code Playgroud)

如果我坚持使用GSON的串行器提供的默认POJO映射,那么这种设计需要每个响应类型有三个类.我的最终目标是通过仅从成功的服务器响应中读取我需要的内容并忽略其余类来减少所需的类数量.我希望我所有的成功,这个API上的回调数据类型尽可能接近"数据"内容.

换句话说,我想非常地返回"数据"的子元素.在上面的例子中,它是一个名为"messages"的数组,但在某些其他响应中,它可能是一个"用户"对象,例如.我知道这可以通过TypeAdapter为每种响应类型注册单独的s 来完成,但我希望通过使用单个通用解决方案来实现我的最终目标.

更新:从下面实施David的建议

public class BaseResponse<T> {
     @SerializedName("status") public String status;
     @SerializedName("error_title") public String errorMessageTitle;
     @SerializedName("error_message") public String errorMessage;
     @SerializedName("data") public T …
Run Code Online (Sandbox Code Playgroud)

android json gson retrofit

11
推荐指数
1
解决办法
5440
查看次数

通过 NavDeepLinkBuilder 的 PendingIntent 发送参数

我在PendingIntent使用NavDeepLinkBuilder. 我可以Activity通过单击通知来启动目标,但是Activity'sIntent不包含我通过NavDeepLinkBuilder. 将Intent代替返回defaultValue在导航图中,我设定- “noJobId”。

通知创建

val notification =
    NotificationCompat.Builder(context, context.getString(R.string.notification_channel_id_new_job))
        ...
        .setContentIntent(
            NavDeepLinkBuilder(context)
                .setComponentName(NewJobDetailsActivity::class.java)
                .setGraph(R.navigation.main_graph)
                .setDestination(R.id.newJobDetailsActivity)
                .setArguments(
                    NewJobDetailsActivityArgs.Builder()
                        .setJobId(event.jobId)
                        .build()
                        .toBundle()
                )
                .createPendingIntent()
        )
        .build()

notificationManager.notify(notificationId, notification)
Run Code Online (Sandbox Code Playgroud)

context通知中使用的是FirebaseMessagingService

目的地Activity onCreate():

val jobId: String = NewJobDetailsActivityArgs.fromBundle(intent?.extras).jobId
Run Code Online (Sandbox Code Playgroud)

main_graph.xml导航图

<navigation
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_graph"
    app:startDestination="@id/jobsFragment">

    <fragment
        android:id="@+id/jobsFragment"
        android:name=".ui.jobs.JobsFragment"
        android:label="JobsFragment">

        <action
            android:id="@+id/action_jobsFragment_to_newJobDetailsActivity"
            app:destination="@id/newJobDetailsActivity" />

    </fragment>

    <fragment
        android:id="@+id/historyFragment"
        android:name=".ui.history.HistoryFragment"
        android:label="HistoryFragment" …
Run Code Online (Sandbox Code Playgroud)

android android-notifications android-activity android-bundle android-architecture-navigation

8
推荐指数
1
解决办法
6504
查看次数

媒体控制通知在Android O上发出警报

自从添加对Android O的支持后,每当我的应用程序的媒体控制通知得到更新(元数据或播放状态更改)时,运行O的Android设备都会收到警报(音调或振动).我正在寻找一种方法来禁用此警报,因为它不适用于媒体样式通知.

这是我用来创建媒体控件通知的代码:

MediaDescriptionCompat description = metadata.getDescription();
String artistName = metadata.getString(MediaMetadataCompat.METADATA_KEY_ARTIST);
String albumName = metadata.getString(MediaMetadataCompat.METADATA_KEY_ALBUM);
Bitmap largeIcon = BitmapFactory.decodeResource(playbackService.getResources(),
        R.drawable.vector_global_defaultsong);

NotificationCompat.Builder notificationBuilder = new NotificationCompat
        .Builder(playbackService, NotificationHelper.CHANNEL_MEDIA_CONTROLS)
        .setColor(ContextCompat.getColor(playbackService, R.color.colorAccent))
        .setSmallIcon(R.drawable.logo_light_filled)
        .setContentTitle(description.getTitle())
        .setContentText(playbackService.getString(R.string.song_list_subtitle_format,
                artistName, albumName))
        .setContentIntent(createContentIntent())
        .setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(playbackService,
                PlaybackStateCompat.ACTION_STOP))
        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
        .setOngoing(playbackState.getState() == PlaybackStateCompat.STATE_PLAYING)
        .setLargeIcon(largeIcon);

notificationBuilder.setStyle(new android.support.v4.media.app.NotificationCompat.MediaStyle()
        // show previous, play/pause, and next in compact view
        .setShowActionsInCompactView(addActions(notificationBuilder))
        .setMediaSession(sessionToken));
showNotification(notificationBuilder.build());
Run Code Online (Sandbox Code Playgroud)

...

private void showNotification(final Notification notification) {
    if (!started) {
        mediaController.registerCallback(mediaControllerCallback);
        playbackService.startForeground(NOTIFICATION_ID, notification);
        started = true;
    } else {
        notificationManager.notify(NOTIFICATION_ID, notification);
    }

    if (playbackState.getState() …
Run Code Online (Sandbox Code Playgroud)

notifications android playback android-8.0-oreo

6
推荐指数
1
解决办法
1107
查看次数

搜索结果在状态栏下方可见地滚动

通过a对数据集执行搜索时UISearchBar,搜索结果会成功显示在UITableViewControllers中UITableView.但是,当向下滚动结果时,UITableView行显示在UINavigationBar模拟器的状态栏下方.

滚动浏览搜索结果

这显然不是我想要的样子.理想情况下,我希望它UISearchBar作为UITableView标题,所有搜索结果都包含在UISearchBar范围按钮下面,但我的尝试都没有成功.

以下是相关UITableViewController及其UITableView属性的Storyboard设置.

搜索结果表视图控制器及其表视图的属性

下面是我用来设置UISearchController它的相关代码UISearchBar.

BallotTunesSearchTableViewController.h

@interface BallotTunesSearchTableViewController : UITableViewController <UISearchControllerDelegate, UISearchResultsUpdating, UISearchBarDelegate>
Run Code Online (Sandbox Code Playgroud)

BallotTunesSearchTableViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    self.appDelegate = [[UIApplication sharedApplication] delegate];

    // Initialize the search controller
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;

    // Setup the search bar
    self.searchController.searchBar.delegate = self;
    self.searchController.searchBar.scopeButtonTitles = [NSMutableArray arrayWithObjects:SongScopeName, ArtistScopeName, AlbumScopeName, nil];
    self.tableView.tableHeaderView = …
Run Code Online (Sandbox Code Playgroud)

uinavigationbar uitableview uiscrollview uisearchbar ios

5
推荐指数
1
解决办法
1198
查看次数

键入时执行搜索

我有一个可以ActivityActionBar's android.support.v7.widget.SearchView(在软键盘上输入“Go”)中提交输入时查询远程数据库的工作搜索。这工作正常,但我最终想在每次SearchView通过添加或删除字符更改 的文本时查询数据库。我的初始化代码SearchView如下。

SearchFragment.javaActivity上面提到的可搜索的子片段)

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_search, menu);

    // Get the searchable.xml data about the search configuration
    final SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
    SearchableInfo searchInfo = searchManager.getSearchableInfo(getActivity().getComponentName());
    // Associate searchable configuration with the SearchView
    mSearchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();
    mSearchView.setSearchableInfo(searchInfo);
    mSearchView.requestFocus();
    mSearchView.onActionViewExpanded();
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            mSearchListAdapter.clear();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) …
Run Code Online (Sandbox Code Playgroud)

search android searchview

5
推荐指数
1
解决办法
2942
查看次数

SeekTo 不会在 MediaControllerCompat 中触发 onPlaybackStateChanged

我有这个媒体播放器,其他一切正常,我开始播放歌曲,它通过 2 个状态,最后一个是 PlaybackStateCompat.STATE_PLAYING

因此我们可以说回调已注册。问题是每当我触发 SeekBar 侦听器时,该方法seekTo都不会触发onPlaybackStateChanged并且因为这不会发生,所以我无法将 SeekBar 更新为它的新进度。这仅涉及 UI。修改SeekBar进度后,音乐实际上是从进度播放的。更重要的是, trackDurationTextView 也不会更新。当我将拇指拖过搜索栏时,它会改变它的值,但是一旦我松开它,它就会进入初始进度,与搜索栏相同。

这是注册回调的地方。

@Override
    public void onServiceConnected(ComponentName componentName, IBinder service) {
        if (service instanceof MediaPlayerService.ServiceBinder) {
            try {
                mediaController = new MediaControllerCompat(this, ((MediaPlayerService.ServiceBinder) service).getService().getMediaSessionToken());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
            mediaController.registerCallback(mMediaControllerCallback);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是回调的初始化方式:

 private MediaControllerCompat.Callback mMediaControllerCallback = new MediaControllerCompat.Callback() {
        @Override
        public void onPlaybackStateChanged(@NonNull PlaybackStateCompat state) {
            updatePlaybackState(state);
        }

        @Override
        public void onMetadataChanged(MediaMetadataCompat metadata) {
            if (metadata != null) {
                updateMediaDescription(metadata.getDescription());
                updateDuration(metadata);
            }
        } …
Run Code Online (Sandbox Code Playgroud)

android android-mediaplayer android-mediasession

5
推荐指数
1
解决办法
1927
查看次数

透明状态栏与操作栏重叠

实际结果:状态栏显示在操作栏ToolbarMenuItem操作栏里面被切断。注意:“测试”是操作栏的title.

JankActionBar

预期结果:操作栏的顶部边界Toolbar应直接出现在状态栏的底部边界下方,并且MenuItem操作栏中的任何s 都应完全可见。

活动的 XML 布局:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/image_background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/background"
        tools:ignore="ContentDescription"/>

    <android.support.v7.widget.Toolbar
        android:id="@+id/action_bar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@android:color/transparent"
        android:fitsSystemWindows="true"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

操作栏titleMenuItem在运行时添加。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    setSupportActionBar((Toolbar) findViewById(R.id.action_bar));
    ActionBar actionBar = getSupportActionBar();
    assert actionBar != null;
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setTitle("Test");
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_test, menu);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

在我添加fitsSystemWindows="true"到 …

android transparent statusbar android-actionbar

4
推荐指数
1
解决办法
3552
查看次数