我需要知道ImageView的宽度和高度.有没有办法在片段中测量它?在标准Activity中我使用:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
image.getWidth();
image.getHeight();
}
Run Code Online (Sandbox Code Playgroud)
但是我可以在哪里使用image.getWidth();和image.getHeight();片段?
我无法解决如何Fragment在典型的列表细节设计模式中正确管理s的问题.
我的布局工作正常,横向视图(双窗格)的结构如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ... >
<FrameLayout android:id="@+id/list" ... />
<FrameLayout android:id="@+id/container" ... />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
像这样的纵向视图(单个窗格):
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container" ... />
Run Code Online (Sandbox Code Playgroud)
我还有一个refs.xmlin res/values-w600dp/,以确保根据设备的屏幕宽度加载适当的布局.
选择列表项时,横向视图应并排显示列表和详细信息,而纵向视图应仅显示全屏详细信息.如果未选择任何内容,则横向视图应显示左侧的左侧和右侧的空白区域,而纵向视图应仅显示全屏列表.

但是,这是我遇到麻烦的地方:
我是否使用"main" Activity作为列表+可选的详细信息布局,另一个"详细信息" Activity用于纵向,仅详细信息布局?这似乎是Fragments指南示例所做的.我已经得到了这个普遍的工作,但是当方向改变时,我如何保持我的细节片段的状态?
考虑上面显示的相反情况 - 从纵向旋转到横向,同时细节可见意味着Activity需要finish()编辑细节,因此主要Activity可以显示双窗格布局,但这也会破坏细节片段及其细节savedInstanceState.如果用户EditText在详细信息片段的字段中键入了信息,然后旋转设备,当我将其添加到主(双窗格)时,如何保留详细信息片段的整个UI状态Activity?
我是否只使用一个Activity并Fragment自己管理?这允许我在方向改变时保留细节UI的状态(因为Android会自动处理这个问题),但是当它涉及到后端堆栈时会变得混乱.
考虑图像中的情况 - 当细节可见时应从横向旋转到纵向应显示单窗格显示详细信息,但如何正确管理后堆栈和ActionBar主页图标以显示列表单窗格?旋转回到横向还需要撤消我之前执行的任何后向堆栈操作,因为两个片段将立即可见.
经过一些搜索后,我发现了两个类似的问题(从双窗格切换到单窗格上的方向更改维护片段堆栈和保留活动之间的片段状态),但我的情况略有不同,因为我不是要尝试改进此功能但是最好预先计划好.我错过了什么?当然,Android可以同时管理后台堆栈(如多个Activity案例)和 UI状态(如单个Activity案例中),对吧?
android android-lifecycle android-fragments android-orientation
我一直有非常奇怪的问题Fragments和方向更改导致强制关闭而不遵循逻辑模式.
我创建了一个简单Activity和Fragment生命周期调试应用程序,它只是实现的每一步活动的生命周期和片段的生命周期由报告调用logcat的.
以下是TestActivity和TestFragment类:
测试活动
public class TestActivity extends Activity {
Context ct = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("ACT", "onCreate called");
ct = getApplicationContext();
FrameLayout fl = new FrameLayout(ct);
fl.setId(1000);
TestFragment tf = new TestFragment();
getFragmentManager().beginTransaction().add(fl.getId(), tf, "").commit();
setContentView(fl);
}
@Override
protected void onStart() {
Log.e("ACT", "onStart called");
super.onStart();
}
@Override
protected void onResume() {
Log.e("ACT", "onResume called");
super.onResume();
}
@Override
protected void …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-activity
我已经为Android开发了不到两年的时间,我仍然对这个看似简单的问题感到困惑.应该何时实施服务?根据我的经验,有一些罕见的情况,但我对此提出质疑,因为在每部手机上都运行了很多,我怀疑它只是一个糟糕的应用程序设计.
这基本上是我的问题的核心,但以下是我对该主题的一些经验和想法,可以更详细地解释我的问题.
在我开发的所有应用程序中,只有一个真正需要服务.这是一个背景录音机,因为我希望按钮能够控制它(就像音乐播放器那样),我将它作为Foreground服务用于通知.
除此之外,我从未真正看到过持续运行服务的要求,因为:
A)Intent侦听器(Manifest注册的BroadcastReceivers)是一个非常有用的功能,如您所知,使用它们通常足以用于许多用例(例如显示通知).
B)如果计划执行是必须的,则可以订阅警报事件.
C)我知道Android中的服务与Windows中的服务完全不同,因为在Android服务中只是用于组织代码的"包",并且系统管理对象的生命周期.服务使用主线程,但习惯上在其中生成新线程.
D)在开发文档中建议使用服务进行网络通信和后台计算,但我不明白为什么你不应该只使用AsyncTasks.我非常喜欢这些并广泛使用它们,从下载数据到在时间紧迫的条件下进行FFT计算.
E)我得到了Foreground服务的有用性,但为什么人们使用后台服务这么多(不包括系统应用程序).
这些是我对服务的看法,我希望有经验的人能够解释这些PROS和CONS(以及我可能错过的其他人).
我真的很好奇如何确定(来自外部类)是否onCreateView()已经调用了一个片段.我搜索过类似的问题但没有找到.
例如,是fragment.isAdded()一个很好的指标?
我的第一个想法很简单fragment.getView() != null,但我并不是100%肯定它看起来是可靠的,而且我也不太愿意使用它(没有特别的原因,我只是倾向于避免无效检查).我很乐意找到一个解决方法.我的建议:
被添加()
如果片段当前已添加到其活动,则返回true.
在我看来,这条线很模糊; 添加没有附加,但都没有创建.它可能是指FragmentTransaction.add()(这在语义上是错误的,因为你可以<fragment>在你的布局中卡住而不必调用add或replace).
尽管如此,FragmentTransaction.add() 文档没有提供信息也没有让你思考added -> created.我会说不.
ISVISIBLE()
如果片段当前对用户可见,则返回true.这意味着:(1)已添加,(2)其视图附加到窗口,(3)未隐藏.
在某种意义上看起来很好,isVisible() -> isCreated但第三种选择使它成为现实isCreated != isVisible.我只想到一个视图分页器中的片段:并非所有片段都可见,但是当前可见片段附近的片段被添加,创建和存活,您可以调用它们上的方法.但对他们来说,isVisible() == false.这有点太严格了.
isInLayout()
如果布局通过<fragment>标记包含在活动视图层次结构中,则返回true.当通过<fragment>标记创建片段时,这将始终为真,除非旧片段从先前状态恢复且未出现在当前状态的布局中.
我不认为这适用于此.
getView()!= null
返回片段的根视图,如果没有布局,则返回null.
这看起来仍然是唯一的解决方案.我只想确认一下.
实现回调
..被称为onCreateView()或更好onViewCreated().但:
getView != null.android android-lifecycle android-fragments android-activity
我只在Android SDK <5.0上收到此错误.所以4.0,4.2,4.3等.运行Android 5.0+的任何东西都能完美运行.有任何想法吗?发射时崩溃.
按照本指南进行设置 - > https://developer.android.com/topic/libraries/architecture/adding-components.html
App.java
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(new AppLifecycleListener(this));
registerActivityLifecycleCallbacks(this);
}
Run Code Online (Sandbox Code Playgroud)
AppLifecycleListener.java
public class AppLifecycleListener implements LifecycleObserver {
private App app;
public AppLifecycleListener(App app)
{
this.app = app;
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onMoveToForeground() {
if (app.getCurrentActivity() instanceof BaseActivity)
{
BaseActivity baseActivity = (BaseActivity) app.getCurrentActivity();
baseActivity.runIsAPIVersionCheck();
baseActivity.fetchObjectsWithHUD(false);
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onMoveToBackground() {}
Run Code Online (Sandbox Code Playgroud)
}
摇篮
compileSdkVersion 26
dexOptions {
javaMaxHeapSize "4g"
}
defaultConfig {
applicationId "app"
minSdkVersion 16
targetSdkVersion 26
versionCode 71
versionName …Run Code Online (Sandbox Code Playgroud) 我需要在 LifecycleObserver 中获取 LifecycleOwner 以将其传递给 ViewModel 观察者。
这是我的 MainActivity,我是否添加了 LifecycleObserver。
public class MainActivity extends AppCompatActivity implements LifecycleOwner{
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commitNow();
}
mLifecycleRegistry=new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
getLifecycle().addObserver(new MyLifecycleObserver());
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的观察者,我需要 LifecycleOwner。
public class MyLifecycleObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStartListener(){
FirebaseMassage.startFirebase();
MainFragment.massageViewModel.getMassage().observe(/*here I need the LifecycleOwner*/, textMassage -> {
FirebaseMassage.updateFirebaseMassage(textMassage);
});
}
}
Run Code Online (Sandbox Code Playgroud) 在Android上,我有一个Activity被叫FirstActivity,它启动一个Service名为MyService在后台做网络的东西.该Activity和Service相互所有的时间通过调用方法通信.
现在,当用户从导航FirstActivity到SecondActivity,后台服务应该不会被杀死或重新创建的,但维持生命,并传递给SecondActivity现在将是一个与服务进行通信.
换句话说,Service只要两个Activitys中的一个正在运行,它就应该运行,并且当用户在两个Activitys 之间导航时它不应该停止.
其中一个Activity将永远在前台,在此期间,服务应该(最佳)永远不会被杀死.我认为这应该不是问题,因为这两个中Activity的一个总是活跃的,因此Android知道服务很重要而不是必须被杀死的东西.
(如果没有办法阻止Android不时地杀死和重新创建服务,我需要一种方法来优雅地恢复服务的完整状态.)
总而言之,它Service应该具有与两个Activity"组合" 相同的寿命.它应该从它们中的第一个开始,并且在它们都被破坏之前停止.
以下代码是否适用于该设置和目标?
public class MyService extends Service {
public class LocalBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
...
}
public class FirstActivity extends Activity {
private MyService mMyService;
private ServiceConnection mMainServiceConnection = new …Run Code Online (Sandbox Code Playgroud) android android-service android-lifecycle android-service-binding
我正在尝试在 MainActivity 中创建我的 AndroidViewModel 实例。当我这样做时,我得到以下错误没有零参数构造函数
这是我的 RecipeViewModel
package com.example.kookrecepten;
import android.app.Application;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import java.util.List;
public class RecipeViewModel extends AndroidViewModel {
private RecipeRepository recipeRepository;
private LiveData<List<Recipe>> allRecipes;
public RecipeViewModel(Application application) {
super(application);
recipeRepository = new RecipeRepository(application);
allRecipes = recipeRepository.getAllRecipes();
}
public void insert(Recipe recipe) {
recipeRepository.insert(recipe);
}
public void update(Recipe recipe) {
recipeRepository.update(recipe);
}
public void delete(Recipe recipe) {
recipeRepository.delete(recipe);
}
public void deleteAll() {
recipeRepository.deleteAllRecipes();
}
public LiveData<List<Recipe>> getAllRecipes() {
return allRecipes;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我错了,现在纠正我,但 AndroidViewModel …
java android android-lifecycle android-studio android-viewmodel
Flow有很多运算符,LiveData只有 3 个(转换)。除了 StateFlow 仍处于试验阶段之外,是否有任何理由继续使用 LiveData ?
更新。StateFlow、SharedFlow 和相应的操作符在 kotlinx.coroutines 1.4.0 中提升为稳定的 API