java - 在 Retrofit 调用后更改折叠工具栏标题

标签 java android retrofit2

我正在尝试根据 Retrofit2 响应修改工具栏标题,但没有任何变化。

getSupportActionBar().setTitle("here work");

final Call<Process> getProcess = WiimApi.getService(serverAddress).getProcess(id);

getProcess.enqueue(new Callback<Process>() {
    @Override
    public void onResponse(Call<Process> call, Response<Process> response) {
        mProcess = response.body();

        getSupportActionBar().setTitle(mProcess.getName()); // this not work
    }

    @Override
    public void onFailure(Call<Process> call, Throwable t) {
        // ... 
    }
});

mProcess.getName() 是来自 JSON 文件的字符串。我也用硬编码字符串进行了测试(防止 mProcess.getName() 错误值)但没有效果。 就在通话之前工作就像一个魅力。

有没有办法在得到回调后更新工具栏标题?

更新

感谢您的帮助。现在我找到了真正的问题:折叠工具栏。 我做了一个空白应用程序来复制错误并且代码有效但是当我使用折叠工具栏运行相同的代码时......宾果游戏!完整代码如下:

主要 Activity .java:

package com.example.retrofittitle;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getData();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void getData() {
        getSupportActionBar().setTitle("Here work ...");

        // https://raw.githubusercontent.com/LearnWebCode/json-example/master/
        final Call<Pet> getPet = MyApi.getService("https://raw.githubusercontent.com/LearnWebCode/json-example/master/").getPet();

        getPet.enqueue(new Callback<Pet>() {
            @Override
            public void onResponse(Call<Pet> call, Response<Pet> response) {
                Pet pet = response.body();

                getSupportActionBar().setTitle(pet.getName()); // Here not work
                TextView text = findViewById(R.id.log);
                text.setText("Done");
            }

            @Override
            public void onFailure(Call<Pet> call, Throwable t) {
                getSupportActionBar().setTitle("Failure Title");
            }
        });

    }
}

MyApi.java

package com.example.retrofittitle;

import retrofit2.Call;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;

public class MyApi {
    public interface ApiService {
        @GET("pet-of-the-day.json")
        Call<Pet> getPet();
    }

    public static ApiService getService(String url) {
        retrofit2.Retrofit retrofit = new retrofit2.Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit.create(ApiService.class);
    }
}

宠物.java

package com.example.retrofittitle;

public class Pet {
    private String name;
    private String species;
    private Integer age;
    private String photo;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSpecies() {
        return species;
    }

    public void setSpecies(String species) {
        this.species = species;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/log"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Requesting..."
        android:layout_gravity="center" />

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="180dp"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleGravity="top"
            app:expandedTitleMarginTop="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:layout_collapseMode="pin" />

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

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

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

解决方案

在发现真正的问题后,我在这里搜索并找到了解决方案: https://github.com/henrytao-me/smooth-app-bar-layout/issues/32

设置 CollapsingToolbarLayout 小部件 ID (collapsing_toolbar) 和 Activity 代码:

CollapsingToolbarLayout mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar);
mCollapsingToolbarLayout.setTitle(pet.getName());

现在改名了:D

最佳答案

我已经在改造回调中尝试了 getSupportActionBar().setTitle("hello"); 它对我来说工作正常。

您的问题是每次调用 onFailure 时都会调用 retrofit。因此 getSupportActionBar().setTitle("hello") 不会被调用。

也可以在 onFailure 中尝试 getSupportActionBar().setTitle("hello")

关于java - 在 Retrofit 调用后更改折叠工具栏标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51847864/

相关文章:

java - 将 double 列表作为数组传递给需要 double 组的函数 - Java

android - 自定义函数 Android SQLite 返回 null

android - 如何使用 rxjava + retrofit2 编写嵌套网络请求

Java BigDecimal 将负值变为正值

java - 如何在类型类的数组中添加 switch 语句?

java - mybatis使用foreach进行批量插入

android - RxJava,改造错误:Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

java - 如何以编程方式让 Android 进入待机状态?

android - 我正在 Google Analytics 上跟踪我的 Android 应用。为什么我似乎有 Macintosh 用户?

java - 如何使用动态模型类中的模型值来改造请求?