【发布时间】:2014-06-20 18:55:56
【问题描述】:
所以我正在开发一个需要并排显示 2 个片段并且仍然可以选择使用这样的导航抽屉的 Android 应用 Image link can't post images :(
我的问题是,当我尝试将任何片段添加到 xml 文件中时,我收到以下错误
06-17 12:18:14.384 2377-2377/com.example.evemanufacturing3.app E/Trace﹕ error opening trace file: No such file or directory (2)
06-17 12:18:14.452 2377-2377/com.example.evemanufacturing3.app D/AndroidRuntime﹕ Shutting down VM
06-17 12:18:14.456 2377-2377/com.example.evemanufacturing3.app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa6236288)
06-17 12:18:14.460 2377-2377/com.example.evemanufacturing3.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.evemanufacturing3.app/com.example.evemanufacturing3.app.MainActivity}: android.view.InflateException: Binary XML file line #24: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #24: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
at android.app.Activity.setContentView(Activity.java:1867)
at com.example.evemanufacturing3.app.MainActivity.onCreate(MainActivity.java:58)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: File null/std contains a path separator
at android.app.ContextImpl.makeFilename(ContextImpl.java:1680)
at android.app.ContextImpl.validateFilePath(ContextImpl.java:1664)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:807)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at database.databaseAdapterEveStaticDataDump.getT1ModulesNames(databaseAdapterEveStaticDataDump.java:84)
at com.example.evemanufacturing3.app.ManufacturingFragment.onCreateView(ManufacturingFragment.java:91)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:807)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1013)
at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1112)
at android.app.Activity.onCreateView(Activity.java:4664)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
at android.app.Activity.setContentView(Activity.java:1867)
at com.example.evemanufacturing3.app.MainActivity.onCreate(MainActivity.java:58)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
我的 drawfragment.xml 文件看起来像这样
<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="left|top">
<fragment
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="com.example.evemanufacturing3.app.ManufacturingFragment"
android:id="@+id/fe1"
tools:layout="@layout/fragment_manufacturing"
android:layout_toRightOf="@+id/fragment2" />
<fragment
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="com.example.evemanufacturing3.app.manufacturingOptionsFragment"
android:id="@+id/fe2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
tools:layout="@layout/fragment_options"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true" />
</RelativeLayout>
</FrameLayout>
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment android:id="@+id/navigation_drawer"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:name="com.example.evemanufacturing3.app.NavigationDrawerFragment"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
我的 MainActivity 看起来像这样
由于尺寸限制,转为喜欢
past bin link code to version 1 off MainActity moved
我一直在尝试更改活动以扩展 fragmentActivity 而不是关闭活动女巫没有工作:( 我也一直在尝试将 2 个片段移动到不同的 xml 文件中,并将内容设置为新的 xml 不起作用:(也许我犯了一些愚蠢的错误我真的不擅长 android 布局:(
如果我只从 MainActivity 添加片段但不显示第二个片段,我的应用程序可以正常工作...第二个我将片段添加到 xml 代码中,我的应用程序在启动时崩溃
编辑
仍然没有进展:( 我一直在托盘上更改布局,甚至设置一个全新的布局文件,仍然在托盘上保留导航抽屉,但仍然出现相同的崩溃错误:(
有什么想法吗??
编辑 2 由于大小限制,迫使我从 MainActivity 中删除第一个版本
所以我在重播后搜索了更多内容。 我将所有导入更改为
android.support.v4.app.
witch 没有任何区别,所以我开始运行调试器来查看应用程序在该行失败的 linje 是什么
setContentView(R.layout.drawfragment);
所以这让我认为我可能会将 setcontent 更改为包含相对布局的另一个 xml,并且 2 个片段给出了相同的错误,所以我托盘删除了 2 个片段,女巫给了我一个错误,人托盘创建导航抽屉。
有人有解决这个问题的方法吗??由于我需要一些不同的方法来创建导航抽屉?
新的 MainActivity 看起来像这样很多偏离主题已经改变,但在主题相关代码中没有太大差异
package com.example.evemanufacturing3.app;
import android.app.Activity;
import android.app.ActionBar;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import com.example.evemanufacturing3.app.Dialogs.PickCharDialog;
import java.io.File;
import java.util.ArrayList;
import database.DatabaseAdapterApp;
import database.copyEveStaticDataDump;
import eveAPI.Download;
import eveCental.EveCentalDownload;
import holders.ApiSet;
import holders.Chars;
public class MainActivity extends FragmentActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks, EveCentalDownload.communicator,PickCharDialog.Communicator,Download.communicator,copyEveStaticDataDump.communicator {
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
// fragment
FragmentManager manager;
FragmentTransaction transaction;
// eve xml
public static ArrayList<Chars> myChars;
static String AccountBalanceFileName = "test.xml";
public static String accountFileName ="AccountFileName.xml";
public static String MainDir;
public static ArrayList<String> keyid = new ArrayList<String>();
public static ArrayList<String> VerificationCode = new ArrayList<String>();
static ArrayList<Integer> charsOnAccount = new ArrayList<Integer>();
// public static ArrayList<ApiSet> apiSets = new ArrayList<ApiSet>();
public Chars activeChar;
private static final String PREFS_NAME = "MyPrefsFile";
public static ProgressDialog mProgressdialog;
//manufacturing fragment
Fragment charFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawfragment);
MainDir= Environment.getExternalStorageDirectory() +"/EveManufactoring";
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
// MainDir= Environment.getExternalStorageDirectory() +"/EveManufactoring";
// MainDir = "/sdcard/EveManufactoring/";
myChars = new ArrayList<Chars>();
// DatabaseAdapterApp db = new DatabaseAdapterApp(this,MainDir);
// ApiSet api = new ApiSet();
// api.setKeyID("2823552");
// api.setVcode("1pD3U6DB0KBha3v0MtUHGkiYZVVVqJNqorESaoFgsjVZ2Rd2tCwnd5b0tTM1lkxE");
// db.addApiSet(api);
manager = getSupportFragmentManager();
SharedPreferences();
}
private void SharedPreferences() {
// TODO Auto-generated method stub
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
if (settings.getBoolean("my_first_time", true)) {
//the app is being launched for first time, do something
Log.d("Comments", "First time");
// first time task
DatabaseAdapterApp db = new DatabaseAdapterApp(this,MainDir);
// db.recreateEveApiSets();
mProgressdialog = ProgressDialog.show(this, "downliading api data", "loading");
mProgressdialog.setCancelable(false);
mProgressdialog.show();
copyEveStaticDataDump d = new copyEveStaticDataDump(this,MainDir);
d.setCommunicator(this);
d.execute();
// record the fact that the app has been started at least once
settings.edit().putBoolean("my_first_time", false).commit();
}else {
DatabaseAdapterApp db = new DatabaseAdapterApp(this,null);
File f = new File(MainDir +"/" + db.getDatabaseName() );
if (!f.exists()) {
// new CreateDBAndFill(this,keyid,VerificationCode).execute("");
int r =0;
mProgressdialog = ProgressDialog.show(this, "downliading api data", "loading");
mProgressdialog.setCancelable(false);
mProgressdialog.show();
ApiSet a = new ApiSet("2823552","1pD3U6DB0KBha3v0MtUHGkiYZVVVqJNqorESaoFgsjVZ2Rd2tCwnd5b0tTM1lkxE");
Download d = new Download(this,a);
d.setCommunicator(this);
d.execute("");
}else{
// SqlDbHelper db = new SqlDbHelper(myContext);
// db.open();
// myChars =db.getTempData();
// db.close();
// p.dismiss();
PickCharDialog p = new PickCharDialog();
p.setCommunicator(this);
p.show(getSupportFragmentManager(),null);
// new Download(this, keyid, VerificationCode).execute("");
}
}
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit();
}
public void onSectionAttached(int number) {
switch (number) {
case 1:
mTitle = getString(R.string.title_section1);
// CharFragment f = new CharFragment();
// FragmentTransaction transaction = manager.beginTransaction();
// transaction.add(R.id.container,f,"Char");
// transaction.commit();
// Download d = new Download(this,apiSets);
// d.setCommunicator(this);
// d.execute("");
// new Download( this, keyid, VerificationCode).execute("");
// mProgressdialog = ProgressDialog.show(this, "downliading api data", "loading");
// mProgressdialog.setCancelable(false);
//
// mProgressdialog.show();
break;
case 2:
mTitle = getString(R.string.title_section2);
charFragment = manager.findFragmentByTag("Char");
FragmentTransaction transaction1 = manager.beginTransaction();
ManufacturingFragment m = new ManufacturingFragment();
transaction1.add(R.id.fe1, m, "Manufactoring");
// transaction1.add(R.id.fe2,new manufacturingOptionsFragment(),"manufacturingOptions");
transaction1.commit();
break;
case 3:
mTitle = getString(R.string.title_section3);
break;
}
}
public void restoreActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
// Only show items in the action bar relevant to this screen
// if the drawer is not showing. Otherwise, let the drawer
// decide what to show in the action bar.
getMenuInflater().inflate(R.menu.main, menu);
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void updateApiData(ArrayList<Chars> c) {
mProgressdialog.dismiss();
this.myChars = c;
PickCharDialog p = new PickCharDialog();
p.PickCharDialog(c);
p.setCommunicator(this);
p.show(getSupportFragmentManager(),null);
}
@Override
public void updateActiveChar(Chars c) {
this.activeChar = c;
}
@Override
public void updateManufacturingListView() {
}
@Override
public void copyEveStaticDataDumpComplete() {
mProgressdialog.dismiss();
SharedPreferences();
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private static final String ARG_SECTION_NUMBER = "section_number";
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
}
}
【问题讨论】:
-
您确定您的
Fragments在com.example.evemanufacturing3.app包中可用吗? -
java 应用程序文件放在 com.example.evemanufacturing3.app 中,所有 xml 文件都放在 res/layout 中
标签: android xml android-fragments navigation-drawer