- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,在 MainAcivity 中编辑方法后,我收到了 RuntimeException。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tim.timapp
/com.example.tim.timapp.MainActivity}: java.lang.IllegalStateException:
Activity has been destroyed
老实说,我不知道这是从哪里来的。在线搜索表明它对 ChildFragmentManager 来说很重要,但没有给我一个适合我的修复程序。
知道我可以做什么来解决这个异常吗?
PS。如果您需要更多代码或信息,请告诉我。我的心因这个错误而非常困惑,所以我可能忽略了这里的一些东西。完整日志:
03-30 21:19:47.910 24785-24785/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tim.timapp, PID: 24785
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tim.timapp/com.example.tim.timapp.MainActivity}: java.lang.IllegalStateException: Activity has been destroyed
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Activity has been destroyed
at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1433)
at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687)
at android.app.BackStackRecord.commit(BackStackRecord.java:663)
at com.example.tim.timapp.MainActivity.DrawVariableFragments(MainActivity.java:271)
at com.example.fragments.Settings.GeneralSettingsFragment.onCreateView(GeneralSettingsFragment.java:57)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1130)
at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1953)
at android.app.FragmentController.dispatchActivityCreated(FragmentController.java:152)
at android.app.Activity.performCreateCommon(Activity.java:6232)
at android.app.Activity.performCreate(Activity.java:6239)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
MainActivity(很抱歉搞砸了,这是一个 WIP):
抱歉,整个文件超过了 30,000 个字符的限制。
http://pastebin.com/XZ9k995G
DBHandler(之前让我感到悲伤,所以可能与此有关):
package com.example.tim.timapp;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import java.util.ArrayList;
public class DBHandler extends SQLiteOpenHelper {
private static String tag = "TEST DBHandler";
private static DBHandler sInstance;
// Database Stuff
private static final int DATABASE_VERSION = 6;
private static final String DATABASE_NAME = "LinkDatabase.db";
// Table Stuff
private static final String TABLE_LinkTable = "LinkTable";
private static final String TABLE_SettingsTable = "SettingsTable";
// LinkTable Stuff
private static final String LT_COLUMN_ID = "_id";
private static final String LT_COLUMN_NAME = "name";
private static final String LT_COLUMN_TAG = "tag";
// SettingsTable Stuff
private static final String ST_COLUMN_ID = "_id";
private static final String ST_COLUMN_NAME = "name";
private static final String ST_COLUMN_IP = "ip";
private static final String ST_COLUMN_PORT = "port";
private static final String ST_COLUMN_USERNAME = "username";
private static final String ST_COLUMN_PASS = "pass";
// Table Create Statements
// LinkTable Create Statement
private static final String CREATE_TABLE_LINKS =
"CREATE TABLE " + TABLE_LinkTable + "(" +
LT_COLUMN_ID + " INTEGER PRIMARY KEY, " +
LT_COLUMN_NAME + " TEXT, " +
LT_COLUMN_TAG + " TEXT" + ");";
// SettingsTable Create Statement
private static final String CREATE_TABLE_SETTINGS =
"CREATE TABLE " + TABLE_SettingsTable + "(" +
ST_COLUMN_ID + " INTEGER PRIMARY KEY, " +
ST_COLUMN_NAME + " TEXT, " +
ST_COLUMN_IP + " TEXT, " +
ST_COLUMN_PORT + " TEXT, " +
ST_COLUMN_USERNAME + " TEXT, " +
ST_COLUMN_PASS + " TEXT" + ");";
// TODO: 28-Mar-16 DON"T FORGET TO UPDATE
// Don't forget to update this when adding a new table.
private static final ArrayList<String> createTablesArray = new ArrayList<String>() {{add(CREATE_TABLE_LINKS); add(CREATE_TABLE_SETTINGS);}};
private static final ArrayList<String> tableNamesArray = new ArrayList<String>() {{add(TABLE_LinkTable); add(TABLE_SettingsTable);}};
public ArrayList<String> tagArray;
public static synchronized DBHandler getInstance(Context context) {
if (sInstance == null) {
Log.d(tag, "sInstance == null");
sInstance = new DBHandler(context.getApplicationContext());
}
return sInstance;
}
private DBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
for (String s : createTablesArray) {
db.execSQL(s);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
for (String s : tableNamesArray) {
db.execSQL("DROP TABLE IF EXISTS " + s);
}
onCreate(db);
}
public ArrayList<String> returnArray(String base, String column) {
SQLiteDatabase db;
db = getWritableDatabase();
String TABLENAME;
if (base.equalsIgnoreCase("StuffManager")) {
TABLENAME = TABLE_LinkTable;
} else if (base.equalsIgnoreCase("GeneralSettings")) {
TABLENAME = TABLE_SettingsTable;
} else {
Log.e(tag, "String Base not recognised");
return null;
}
String query = "SELECT * FROM " + TABLENAME + " WHERE 1";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
ArrayList<String> tempArray = new ArrayList<>();
int i = 0;
while(!c.isAfterLast()){
if(c.getString(c.getColumnIndex(column)) != null){
tempArray.add(i, c.getString(c.getColumnIndex(column)));
} else {
Log.e(tag, "String Column not recognised");
return null;
}
c.moveToNext();
i++;
}
c.close();
if (db != null && db.isOpen()) {
db.close();
}
return tempArray;
}
// *** --------- ***
//
// All methods for the SETTINGS_TABLES
//
// *** --------- ***
public void addSettings(String name, String ip, String port, String username, String pass) {
ContentValues values = new ContentValues();
values.put(ST_COLUMN_NAME, name);
values.put(ST_COLUMN_IP, ip);
values.put(ST_COLUMN_PORT, port);
values.put(ST_COLUMN_USERNAME, username);
values.put(ST_COLUMN_PASS, pass);
SQLiteDatabase db;
db = getWritableDatabase();
db.insert(TABLE_SettingsTable, null, values);
db.close();
}
public void updateSettings(int id, String name, String ip, String port, String username, String pass) {
ContentValues values = new ContentValues();
values.put(ST_COLUMN_NAME, name);
values.put(ST_COLUMN_IP, ip);
values.put(ST_COLUMN_PORT, port);
values.put(ST_COLUMN_USERNAME, username);
values.put(ST_COLUMN_PASS, pass);
SQLiteDatabase db;
db = getWritableDatabase();
db.update(TABLE_SettingsTable, values, "_id=" + id, null);
db.close();
}
public void deleteSettings(String name) {
SQLiteDatabase db;
db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_SettingsTable + " WHERE " + ST_COLUMN_NAME + "=\"" + name + "\";");
db.close();
}
public void deleteAllSettings() {
SQLiteDatabase db;
db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_SettingsTable + " WHERE 1");
db.close();
}
public float settingsTableSize() {
SQLiteDatabase db;
db = getReadableDatabase();
float amount = DatabaseUtils.queryNumEntries(db, TABLE_SettingsTable);
db.close();
return amount;
}
public ArrayList<String> settingsNameArrayMethod() {
SQLiteDatabase db;
db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_SettingsTable + " WHERE 1";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
int i = 0;
ArrayList<String> nameArray = new ArrayList<>();
while (!c.isAfterLast()) {
if (c.getString(c.getColumnIndex("name")) != null) {
nameArray.add(i, c.getString(c.getColumnIndex("name")));
}
c.moveToNext();
i++;
}
c.close();
db.close();
return nameArray;
}
// *** --------- ***
//
// All methods for the LINK_TABLES
//
// *** --------- ***
public void addStuffLink(String name, String tag) {
ContentValues values = new ContentValues();
values.put(LT_COLUMN_NAME, name);
values.put(LT_COLUMN_TAG, tag);
SQLiteDatabase db;
db = getWritableDatabase();
db.insert(TABLE_LinkTable, null, values);
db.close();
}
public Bundle updateStuffLink(int id, String name, String tag) {
ContentValues values = new ContentValues();
values.put(LT_COLUMN_NAME, name);
values.put(LT_COLUMN_TAG, tag);
SQLiteDatabase db;
db = getWritableDatabase();
db.update(TABLE_LinkTable, values, "_id=" + id, null);
db.close();
ArrayList<String> nameArray = stuffLinksNameArrayMethod();
ArrayList<String> tagArray = tagArrayMethod();
Bundle bundle = new Bundle();
bundle.putStringArrayList("nameArray", nameArray);
bundle.putStringArrayList("tagArray", tagArray);
return bundle;
}
public void deleteStuffLink(String name) {
SQLiteDatabase db;
db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_LinkTable + " WHERE " + LT_COLUMN_NAME + "=\"" + name + "\";");
db.close();
}
public void deleteAllStuffLinks() {
SQLiteDatabase db;
db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_LinkTable + " WHERE 1");
db.close();
}
public ArrayList<String> stuffLinksNameArrayMethod(){
SQLiteDatabase db;
db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_LinkTable + " WHERE 1";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
int i = 0;
ArrayList<String> nameArray = new ArrayList<>();
tagArray = new ArrayList<>();
while(!c.isAfterLast()){
if(c.getString(c.getColumnIndex("name")) != null){
nameArray.add(i, c.getString(c.getColumnIndex("name")));
tagArray.add(i, c.getString(c.getColumnIndex("tag")));
}
c.moveToNext();
i++;
}
c.close();
db.close();
return nameArray;
}
public ArrayList<String> tagArrayMethod() {
stuffLinksNameArrayMethod();
return tagArray;
}
public float stuffTableSize(){
SQLiteDatabase db;
db = getReadableDatabase();
float amount = DatabaseUtils.queryNumEntries(db, TABLE_LinkTable);
db.close();
return amount;
}
}
常规设置 fragment
package com.example.fragments.Settings;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.example.fragments.MainFragments.DialogFragments.GeneralSettingsInitialInputDialog;
import com.example.fragments.MainFragments.VariableFragments.GeneralSettingsEmptyFragment;
import com.example.fragments.MainFragments.VariableFragments.GeneralSettingsVariableFragment;
import com.example.fragments.MainFragments.VariableFragments.StuffManagerVariableFragment;
import com.example.tim.timapp.DBHandler;
import com.example.tim.timapp.MainActivity;
import com.example.tim.timapp.R;
import java.util.ArrayList;
public class GeneralSettingsFragment extends Fragment {
DBHandler dbHandler;
MainActivity ma = new MainActivity();
private static Menu optionsMenu;
public static boolean hideDeleteAllButton = false;
LinearLayout linearLayout;
View rootView;
@Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_generalsettings, container, false);
linearLayout = (LinearLayout) rootView.findViewById(R.id.FragmentContainerGeneralSettings);
if (linearLayout == null) {
Log.e("GMF", "Layout is null");
} else if (linearLayout.getChildCount() == 0) {
GeneralSettingsInitialInputDialog GSIID = new GeneralSettingsInitialInputDialog();
GSIID.show(getFragmentManager(), "dialog");
hideDeleteAllButton = true;
} else {
hideDeleteAllButton = false;
}
ma.DrawVariableFragments("GeneralSettings", "draw");
return rootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.stuffmanager_actionbuttons, menu);
optionsMenu = menu;
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
optionsMenu.findItem(R.id.removeAllButton).setVisible(!hideDeleteAllButton);
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.addButton:
GeneralSettingsInitialInputDialog GSIID = new GeneralSettingsInitialInputDialog();
GSIID.show(getFragmentManager(), "dialog");
return true;
case R.id.removeAllButton:
dbHandler = DBHandler.getInstance(getActivity());
final ArrayList<String> nameArray = dbHandler.settingsNameArrayMethod();
final FragmentManager fm = getFragmentManager();
AlertDialog.Builder removeAllDialog = new AlertDialog.Builder(getActivity())
.setTitle("Delete all?")
.setMessage("Are you sure you want to delete all your devices? This is irreversible.")
.setIcon(R.drawable.ic_delete_black)
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dbHandler.deleteAllSettings();
for (String name : nameArray){
fm.beginTransaction().remove(fm.findFragmentByTag(name)).commit();
}
fm.executePendingTransactions();
// TODO: 30-Mar-16 Add "No devices created" screen like stuffmanager
hideDeleteAllButton = true;
getActivity().invalidateOptionsMenu();
}
})
.setNegativeButton("Cancel", null);
removeAllDialog.show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
最佳答案
MainActivity ma = new MainActivity();
这在 Android 中无效。您无法创建这样的 Activity 实例,因为它实际上并未附加到 Android 进程。 MainActivity
的此实例不会单步执行任何生命周期方法,这就是您看到 Activity 已停止的错误的原因。它从未真正开始过。
相反,请删除对 MainActivity
的引用,因为在 fragment 中保留此类引用是不好的做法。任何时候您需要在 fragment 中使用 MainActivity
实例,请使用以下示例:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ...
MainActivity ma = (MainActivity) getActivity();
ma.DrawVariableFragments("GeneralSettings", "draw");
// ...
}
关于java - 为什么我的 Activity 在添加 fragment 时会被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36320068/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!