当我尝试添加Navigation到我的时候,我遇到了一个奇怪的错误CropsListPage
<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-Balloney.Views"
x:Class="Balloney.Views.MainPage">
<NavigationPage Icon="carrot.png">
<x:Arguments>
<local:CropListPage/>
</x:Arguments>
</NavigationPage>
<ContentPage Icon="search.png"></ContentPage>
</TabbedPage>
Run Code Online (Sandbox Code Playgroud)
然后它导致..
如果我不试图将它包裹在一起NavigationPage,它就会保持正常
知道是什么导致了这种行为吗?在尝试克服我的方式并硬编码Android中状态栏的大小之前,我正在寻找一种方法来理解问题并防止它.谢谢
MainPage.xaml 现在工作
<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Balloney.Views"
x:Class="Balloney.Views.MainPage">
<local:CropListPage Icon="carrot.png"/>
<ContentPage Icon="search.png"></ContentPage>
</TabbedPage>
Run Code Online (Sandbox Code Playgroud)
和CropListxaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Balloney.Views.CropListPage">
<ListView ItemsSource="{Binding CropsList}" ItemTapped="OnCropTapped">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal">
<Image Source="{Binding ImageUrl}" VerticalOptions="Fill" WidthRequest="50"/>
<StackLayout HorizontalOptions="StartAndExpand">
<Label Text="{Binding Specie.Name}"/>
<Label Text="{Binding HarvestDate}" FontSize="Micro" TextColor="Black"/>
</StackLayout>
<Label Text="{Binding Location}" FontSize="Micro" TextColor="Chocolate" …Run Code Online (Sandbox Code Playgroud) 我在stackoverflow和Android文档上学到了什么.最后我得出结论:
无法为连续任务创建后台服务.如果我真的想要一个服务,我应该启动一个前台服务,用户不断看到一个持久的通知"应用程序正在运行".无法隐藏此通知.它是由谷歌有意添加的.是的,还有其他选项,如WorkManager和JobScheduler, 但它们确实定期不连续工作.
我想要的是构建一个即时消息应用程序,它使用xmpp或套接字连续连接到服务器.但它需要连续的连接,但我不想使用前台服务,因为它向用户显示一个恼人的通知"应用正在运行".
问题1: Whatsapp和其他即时消息应用程序如何持续连接到服务器但不显示持久通知?他们是如何做到这一点的?
问题2:如果Whatsapp使用FCM进行通知,那么它也适用于那些没有安装playservices的手机,那么Whatsapp通知机制如何运作?
<div fxFill fxLayout="column">
<div fxFlex="8" fxLayout="column"> Fixed Header </div>
<div fxFlex="20" fxLayout="row" [fxHide]="isShow"> Colapsable Header </div>
<div fxFlex="72" fxLayout="column"> Page content </div>
</div>
Run Code Online (Sandbox Code Playgroud)
像这样,如果我隐藏标题,页面的20%保持空白,导致包含页面内容的div仍然只占据72%
但是如果我使用 with calc <div fxFlex="calc(92% - 20%)">,这个各自的 div 会根据上面的 div 是隐藏还是显示来修改她的高度,所以即使 div 被折叠起来也永远不会有空白空间..
为什么它会这样工作?calc(92% - 20%) 它总是 72%,那么为什么它的行为不同呢?
编辑问题标题后的更多上下文:
在观察生成的 Html 后,我收集到了
fxFlex="72" 设置一个 max-height="72%"fxFlex="calc(92%-20%)" 套 min-height="72%"我是 Room 的新手,我不明白我应该怎么做。我有一个实体Movie和另一个实体称为ÙpcomingMovies.
@Entity
public class Movie {
@PrimaryKey
@NonNull
public String id;
@ColumnInfo
public String name;
@ColumnInfo
public String title;
}
@Entity
public class UpcomingMovies {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo
public Movie movie;
}
Run Code Online (Sandbox Code Playgroud)
所以我已经知道 Room 在转换对象时有问题,但我仍然没有看到如何使用TypeConverter. 可能我把事情复杂化了,但有人可以帮我解决这个问题吗?我什至不确定我的 UpcomingMovies 表是否制作精良。
欣赏它
我的观察者回调没有被调用,你能指出我做错了什么吗?我的应用程序非常简单,因为我只是在测试这个架构
主活动代码
viewModel = ViewModelProviders.of(this).get(UpcomingMoviesViewModel.class);
viewModel.getUpcomingMovies().observe(this, upcomingMovies -> {
// NOT CALLED !!!
for(UpcomingMovies movie : upcomingMovies) {
Log.d("Upcoming", "Movie - " + movie.movie.title);
}
});
Run Code Online (Sandbox Code Playgroud)
视图模型代码
private LiveData<List<UpcomingMovies>> mUpcomingMovies;
private MovieRepository movieRepository;
public UpcomingMoviesViewModel(@NonNull Application application ) {
super(application);
movieRepository = MovieRepository.getsInstance(application);
}
public LiveData<List<UpcomingMovies>> getUpcomingMovies() {
mUpcomingMovies = movieRepository.getUpcomingMovies();
return mUpcomingMovies;
}
Run Code Online (Sandbox Code Playgroud)
还有我的存储库方法
public LiveData<List<UpcomingMovies>> getUpcomingMovies(){
if(movieDao.loadUpcomingMovies().getValue() == null) {
webService.getUpcomingMovies(api_key).
enqueue(new Callback<MovieResults>() {
@Override
public void onResponse(Call<MovieResults> call, Response<MovieResults> response) {
MovieResults results = response.body();
if(results == …Run Code Online (Sandbox Code Playgroud)