我正在使用DialogFragment在onCreateDialog()中返回DatePickerDialog.我已将dateSetListener设置为DialogFragment(下面的示例中为"this"),除了在屏幕旋转发生时调用onDateSet()时,一切正常,这是不可取的.如何在旋转屏幕时让onDateSet不被调用?
我的DialogFragment
public static class DateDialogFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener{
public static DateDialogFragment newInstance() {
return new DateDialogFragment();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(getActivity(), this, 2012, 11, 19);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
//This is called when screen rotated, which I dont want
Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show();
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所说的
if(getActivity()!=null){
FragmentManager fm = getActivity().getSupportFragmentManager();
DialogFragment newFragment = DateDialogFragment.newInstance();
newFragment.show(fm, "dialog");
}
Run Code Online (Sandbox Code Playgroud) 在我当前的应用程序中,第一次加载Activity时会触发onResume函数.我查看了Activity Lifecycle,但我没有找到防止这种情况发生的方法.
我是否可以在第一次加载Activity时阻止加载onResume()函数,而不使用SharedPreferences?
android onresume sharedpreferences android-lifecycle android-activity
我遇到的问题onActivityCreated()是在调用activity的onStart()方法后调用我的片段方法.这似乎意味着我的活动的onCreate()方法正在完成之后onStart()?情况不是这样......可以吗?在我的活动的生命周期中,我的片段onActivityCreated()被称为?此外,如果我有多个片段,我如何控制片段onActivityCreated()调用的顺序?
在我的活动中:
@Override
protected void onStart() {
super.onStart();
methodA(); // this is called ...
}
Run Code Online (Sandbox Code Playgroud)
在我的片段中:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
methodB(); // ... before this
}
Run Code Online (Sandbox Code Playgroud) java android android-lifecycle android-fragments android-activity
我已经写了很长时间的Android应用程序,但现在我遇到了一个我从未想过的问题.这是关于Android的生命周期Activitys,并Fragments在有关的配置更改.为此,我用这个必要的代码创建了一个小应用程序:
public class MainActivity extends FragmentActivity {
private final String TAG = "TestFragment";
private TestFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
fragment = (TestFragment) fm.findFragmentByTag(TAG);
if (fragment == null) {
fragment = new TestFragment();
fm.beginTransaction().add(R.id.fragment_container, fragment, TAG).commit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码TestFragment.需要注意的是我打电话setRetainInstance(true);的onCreate方法,这样的片段没有在配置更改后recrated.
public class TestFragment extends Fragment implements View.OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater li, …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-activity
TLDR:finishAffinity()和finishAndRemoveTask()之间有什么区别?
我正在开发一个只有一个活动的Android应用程序,并使用片段切换而不是新活动.
即使在清理后台堆叠时,我也会遇到一个奇怪的问题,即通过背板生活的某个碎片.长话短说,这个片段是活的,因为我从那个片段开始了一个网络浏览器.
使用流行的按回x2在我的主要活动中退出app技术,它将使用finishAndRemove任务"退出".这将返回到某个片段,而不是完全退出.将后面的x2退出流程从finishAndRemoveTask更改为finishAffinity解决了我的问题.为什么这样做?
我正在尝试使用 Android 生命周期,但我正在准备添加生命周期编译器依赖项。
这是模块 build.gradle,
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 25
buildToolsVersion "26.0.0"
dataBinding {
enabled = true
}
defaultConfig {
applicationId "com.example.jj.mvvm"
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
kapt 'com.android.databinding:compiler:2.3.3'
implementation "android.arch.lifecycle:runtime:1.0.0" …Run Code Online (Sandbox Code Playgroud) 在之前Lifecycle和之前LiveData,Viewmodel可以很容易地观察到它自己的观察者的变化.这只是订阅Observable*变化并对其做出反应的问题.然后可以使用双向绑定立即对用户的输入做出反应.
在Android Studio Canary中,现在允许绑定到LiveData对象,前提是Binding知道其所有者的生命周期(ViewBinding现在有其他setLifecycle方法),Android Studio Canary信息:
您现在可以将LiveData对象用作数据绑定表达式中的可观察字段.ViewDataBinding类现在包含一个新的setLifecycle方法,您需要使用该方法来观察LiveData对象.
但是,Viewmodel文档清楚地说明了:
ViewModel对象可以包含LifecycleObservers,例如LiveData对象.但是,ViewModel对象绝不能观察到生命周期感知的可观察对象(例如LiveData对象)的更改.
(强调我的)
那么,如果ViewModel无法订阅它们,那么如何立即对LiveData更改做出反应呢?
而且,为什么 Viewmodel无法观察到自己的LiveData的变化?
我想(至少部分地)决定当应用程序被用户释放一些连接等。要做到这一点关门,我现在用的是ProcessLifecycleOwner我的应用程序类实现LifecycleObserver。尽管从教程和其他有用的文章中获取了起始代码,但它似乎没有检测到任何生命周期事件。
大部分代码来自这个例子。
我的应用类:
public class App extends Application implements LifecycleObserver {
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void created() {
Log.d("SampleLifeCycle", "ON_CREATE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void started() {
Log.d("SampleLifeCycle", "ON_START");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void resumed() {
Log.d("SampleLifeCycle", "ON_RESUME");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void paused() {
Log.d("SampleLifeCycle", "ON_PAUSE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void stopped() {
Log.d("SampleLifeCycle", "ON_STOP");
}
}
Run Code Online (Sandbox Code Playgroud)
Gradle 中的依赖
dependencies {
//...
implementation 'android.arch.lifecycle:extensions:1.1.1'
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,无论应用程序是进入前台还是后台,此代码都没有记录任何类型的单个事件。
编辑
注意:您需要在 Manifest 中声明您的应用程序,以便在您的自定义应用程序类中工作。
java android android-lifecycle android-architecture-components
我的视图模型工厂:
class ViewModelFactory @Inject constructor(
private val viewModelMap: MutableMap<Class<out ViewModel>, ViewModelAssistedFactory<out ViewModel>>,
owner: SavedStateRegistryOwner,
defaultArgs: Bundle?
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
@Throws(IllegalStateException::class)
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
return viewModelMap[modelClass]?.create(handle) as? T ?: throw IllegalStateException("Unknown ViewModel class")
}
}
Run Code Online (Sandbox Code Playgroud)
活动:
@Inject
lateinit var viewModelFactory: ViewModelFactory
protected val viewModel: ViewModel by lazy { ViewModelProvider(this, viewModelFactory).get(getViewModelClass()) }
Run Code Online (Sandbox Code Playgroud)
视图模型:
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<SplashViewModel>
Run Code Online (Sandbox Code Playgroud)
我想知道如何动态提供 defaultArgs 而不是:
活动模块
@Module
companion object …Run Code Online (Sandbox Code Playgroud) android android-lifecycle dagger-2 android-viewmodel viewmodel-savedstate
我最近更新了我的Android 应用程序项目(Android Gradle Plugin 7.0.3、targetSdk 30、JVM 11)的Travis CI 配置以使用新的命令行工具。我选择启动模拟器来运行仪器测试。我在用。system-images;android-19;google_apis;armeabi-v7aandroidx.test.espresso:espresso-core:3.4.0
模拟器启动并执行仪器测试,connectedDebugAndroidTest但全部失败并出现以下错误:
AboutActivityTest > renderBuildInformation[test(AVD) - 4.4.2] FAILED
java.lang.AssertionError: Activity never becomes requested state
"[DESTROYED, STARTED, RESUMED, CREATED]" (last lifecycle transition = "PRE_ON_CREATE")
at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:338)
...
Run Code Online (Sandbox Code Playgroud)
Gradle 然后输出:
Caused by: org.gradle.api.GradleException: There were failing tests. See the report
at: file:///home/travis/build/Umweltzone/Umweltzone/Umweltzone/build/reports/androidTests/connected/index.html
at com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.doTaskAction(DeviceProviderInstrumentTestTask.java:388)
at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:63)
at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
...
Run Code Online (Sandbox Code Playgroud)
完整构建日志:
如果我在 Pixel 2 设备、Android 11 (SDK 30) 上本地运行相同的测试,则会成功执行。
如何修复 Travis CI / Android 模拟器配置? …
android android-emulator android-lifecycle travis-ci android-espresso