我正在开发一个应用程序,每次运行它时,我都收到消息:
不幸的是,MyApp已经停止了.
我该怎么做才能解决这个问题?
关于这个问题 - 显然受到什么是堆栈跟踪的启发,以及如何使用它来调试我的应用程序错误?,有很多问题表明他们的应用程序崩溃了,没有任何进一步的细节.这个问题旨在指导新手Android程序员如何尝试自己解决问题,或者提出正确的问题.
我从我的应用程序中获取用户报告,提供以下异常:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyUp(Activity.java:2044)
at android.view.KeyEvent.dispatch(KeyEvent.java:2529)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.widget.TabHost.dispatchKeyEvent(TabHost.java:297)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2880)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2853)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2028)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4028)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) …Run Code Online (Sandbox Code Playgroud) android illegalstateexception android-fragments android-viewpager fragmenttransaction
我创建了一个代表我的问题的小测试应用程序.我正在使用ActionBarSherlock来实现带有(Sherlock)Fragments的选项卡.
我的代码:
TestActivity.java
public class TestActivity extends SherlockFragmentActivity {
private ActionBar actionBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupTabs(savedInstanceState);
}
private void setupTabs(Bundle savedInstanceState) {
actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
addTab1();
addTab2();
}
private void addTab1() {
Tab tab1 = actionBar.newTab();
tab1.setTag("1");
String tabText = "1";
tab1.setText(tabText);
tab1.setTabListener(new TabListener<MyFragment>(TestActivity.this, "1", MyFragment.class));
actionBar.addTab(tab1);
}
private void addTab2() {
Tab tab1 = actionBar.newTab();
tab1.setTag("2");
String tabText = "2";
tab1.setText(tabText);
tab1.setTabListener(new TabListener<MyFragment>(TestActivity.this, "2", MyFragment.class));
actionBar.addTab(tab1);
}
}
Run Code Online (Sandbox Code Playgroud)
TabListener.java
public class TabListener<T extends SherlockFragment> …Run Code Online (Sandbox Code Playgroud) 首先,这个问题提出了一个非常相似的问题.但是,我的问题有一个微妙的区别.
我想知道的是,是否可以以编程colorPrimary方式将主题的属性更改为任意颜色?
例如,我们有:
<style name="AppTheme" parent="android:Theme.Material.Light">
<item name="android:colorPrimary">#ff0000</item>
<item name="android:colorAccent">#ff0000</item>
</style>
Run Code Online (Sandbox Code Playgroud)
在运行时,用户决定他想#ccffff用作主要颜色.当然,我无法为所有可能的颜色创建主题.
我不介意我是否必须做hacky的东西,比如依赖Android的私人内部,只要它使用公共SDK.
我的目标是最终拥有ActionBar 和所有小工具喜欢CheckBox使用这种原色.
如果我有一个可空的Boolean b,我可以在Java中进行以下比较:
Boolean b = ...;
if (b != null && b) {
/* Do something */
} else {
/* Do something else */
}
Run Code Online (Sandbox Code Playgroud)
在Kotlin中,我可以通过使用!!运算符来实现相同的目的:
val b: Boolean? = ...
if (b != null && b!!) {
/* Do something */
} else {
/* Do something else */
}
Run Code Online (Sandbox Code Playgroud)
然而,!!对我来说使用感觉有点粗略,绕过零安全系统.
有更优雅的方法吗?
编辑似乎我有点过分了.对于局部变量,如Banthar所示,它确实有效.但是,我的布尔b实际上是一个"具有支持字段的属性"(我实际上并没有达到速度,而是强加了它).这是结果:
我想创建一个带有透明标签的ActionBar #3b000000.像这样的东西,但在ActionBar下面有标签:
这是我在styles.xml中使用的代码:
<style name="Theme.MyTheme" parent="@style/Theme.Sherlock.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ActionBar</item>
<item name="windowActionBarOverlay">true</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="actionBarStyle">@style/ActionBar</item>
</style>
<style name="ActionBar" parent="@style/Widget.Sherlock.Light.ActionBar">
<item name="android:background">@color/actionbar</item>
<item name="background">@color/actionbar</item>
<item name="android:actionBarTabStyle">@style/ActionBarTabStyle</item>
<item name="actionBarTabStyle">@style/ActionBarTabStyle</item>
</style>
<style name="ActionBarTabStyle" parent="@style/Widget.Sherlock.ActionBar.TabView">
<item name="background">@color/actionbar_tabs</item>
<item name="android:background">@color/actionbar_tabs</item>
</style>
Run Code Online (Sandbox Code Playgroud)
会发生什么,ActionBar本身确实显示透明的背景颜色,但标签是完全透明的(没有颜色可见).
我怎么解决这个问题?
我想在一周的开头和当周的结束之间创建一个间隔.
我从以下答案中借鉴了以下代码:
private LocalDateTime calcNextSunday(LocalDateTime d) {
if (d.getDayOfWeek() > DateTimeConstants.SUNDAY) {
d = d.plusWeeks(1);
}
return d.withDayOfWeek(DateTimeConstants.SUNDAY);
}
private LocalDateTime calcPreviousMonday(LocalDateTime d) {
if (d.getDayOfWeek() < DateTimeConstants.MONDAY) {
d = d.minusWeeks(1);
}
return d.withDayOfWeek(DateTimeConstants.MONDAY);
}
Run Code Online (Sandbox Code Playgroud)
但现在我希望周一LocalDateTime是00:00:00,周日LocalDateTime是23:59:59.我该怎么做?
在xml中,您可以执行以下操作:
<TextView
...
android:layout_centerHorizontal="true"
...
/>
Run Code Online (Sandbox Code Playgroud)
当我有实例时,我将如何以TextView编程方式执行此操作?
我正在使用新的DrawerLayout侧面导航.我正在使用这样的抽屉图标('汉堡包'):
@Override
protected void onStart() {
super.onStart();
mDrawerLayout = (DrawerLayout) findViewById(R.id.activity_main_drawerlayout);
mDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
R.drawable.ic_navigation_drawer,
R.string.app_name,
R.string.app_name);
mDrawerLayout.setDrawerListener(mDrawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我Fragment向backstack 添加一个时,我想再次显示后退箭头,这样用户就可以导航回"home",然后才打开app抽屉.
如何将抽屉图标重置为后退图标?
我想要的箭头:

我正在尝试lateinit使用泛型类型的非可空属性创建参数化类:
class Test<T> {
private lateinit var t : T
private lateinit var s : String
}
Run Code Online (Sandbox Code Playgroud)
后者是允许的,但前者不是.编译器返回以下错误:
Error:(7, 11) ''lateinit'' modifier is not allowed on nullable properties
Run Code Online (Sandbox Code Playgroud)
由于我没有申报T?,我很困惑为什么会这样.