0

我正在爲平板電腦和手機開發Android應用程序。我寫了我自己的片段類和他們相應的活動。但是當我運行該應用程序時,我收到以下錯誤。Android應用程序中的例外

LogCat 

07-23 18:56:10.200: E/AndroidRuntime(691): FATAL EXCEPTION: main 
07-23 18:56:10.200: E/AndroidRuntime(691): java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.fxpal.unity.android/com.fxpal.unity.android.MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.os.Looper.loop(Looper.java:137) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.ActivityThread.main(ActivityThread.java:4424) 
07-23 18:56:10.200: E/AndroidRuntime(691): at java.lang.reflect.Method.invokeNative(Native Method) 
07-23 18:56:10.200: E/AndroidRuntime(691): at java.lang.reflect.Method.invoke(Method.java:511) 
07-23 18:56:10.200: E/AndroidRuntime(691): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-23 18:56:10.200: E/AndroidRuntime(691): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-23 18:56:10.200: E/AndroidRuntime(691): at dalvik.system.NativeStart.main(Native Method) 
07-23 18:56:10.200: E/AndroidRuntime(691): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
07-23 18:56:10.200: E/AndroidRuntime(691): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.Activity.setContentView(Activity.java:1835) 
07-23 18:56:10.200: E/AndroidRuntime(691): at com.fxpal.unity.android.MainActivity.onCreate(MainActivity.java:20) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.Activity.performCreate(Activity.java:4465) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
07-23 18:56:10.200: E/AndroidRuntime(691): ... 11 more 
07-23 18:56:10.200: E/AndroidRuntime(691): Caused by: java.lang.NullPointerException 
07-23 18:56:10.200: E/AndroidRuntime(691): at com.fxpal.unity.android.EveryoneAdapter.<init>(EveryoneAdapter.java:24) 
07-23 18:56:10.200: E/AndroidRuntime(691): at com.fxpal.unity.android.GridFragment.onCreateView(GridFragment.java:21) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:806) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1010) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1108) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.app.Activity.onCreateView(Activity.java:4243) 
07-23 18:56:10.200: E/AndroidRuntime(691): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673) 
07-23 18:56:10.200: E/AndroidRuntime(691): ... 21 more 

這裏是我EveryoneAdapter類

package com.fxpal.unity.android; 

    import java.util.ArrayList; 

    import android.content.ComponentName; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.view.ViewGroup; 
    import android.widget.BaseAdapter; 
    import android.widget.GridView; 
    import android.widget.ImageView; 


public class EveryoneAdapter extends BaseAdapter { 
private Context mContext; 
private UnityMobileApp appCtx; 
private ArrayList<String> mNamesList; 

public EveryoneAdapter(Context c, UnityMobileApp a) { 
    mContext = c; 
    appCtx = a; 
    mNamesList = new ArrayList<String>(a.everyone.keySet()); 
} 

public int getCount() { 
    System.out.println(mNamesList.size()); 
    return mNamesList.size(); 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return 0; 
} 

// create a new ImageView for each item referenced by the Adapter 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    Person p = appCtx.everyone.get(mNamesList.get(position)); 

    if (convertView == null) { // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 

     imageView.setLayoutParams(new GridView.LayoutParams(66, 66)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 

    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageBitmap(p.getRoundedImage(Consts.SMALL_USER_IMAGE_SIZE, Consts.SMALL_USER_IMAGE_BORDER)); 
    imageView.setContentDescription(p.getUsername()); 
    // example adapter imageView.setImageResource(mThumbIds[position]); 
    final String mUsername = p.getUsername(); 
    imageView.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 

      Intent i = new Intent(); 
      String pkg_name = EveryoneAdapter.class.getPackage().getName(); 
      i.setComponent(new ComponentName(pkg_name, pkg_name + ".IndividualViewActivity")); 
      i.putExtra(Consts.EXTRA_USERNAME, mUsername); 
      mContext.startActivity(i); 
     } 
    }); 

    return imageView; 
} 
} 

而且我GridFragment類是

package com.fxpal.unity.android; 

import com.fxpal.unity.android.EveryoneAdapter; 
import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.GridView; 


public class GridFragment extends Fragment{ 
public UnityMobileApp appCtx; 
public EveryoneAdapter everyoneAdapter; 
@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.gridview,container,false); 
    if(everyoneAdapter == null || everyoneAdapter.getCount()!=appCtx.everyone.size()){ 
    GridView gridView = (GridView) view.findViewById(R.id.gridView); 
    gridView.setAdapter(new EveryoneAdapter(view.getContext(),appCtx)); 
    }// uses the view to get the context instead of getActivity(). 
    else 
    { 
     everyoneAdapter.notifyDataSetChanged(); 
    } 
    return view; 
} 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
} 

} 

我IndividualViewFragment級低於

package com.fxpal.unity.android; 

import com.fxpal.unity.android.Person; 
import android.app.Dialog; 
import android.app.Fragment; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.preference.PreferenceManager; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TextView; 
import android.widget.Toast; 

    public class IndividualViewFragment extends Fragment { 


private static final String DB_TAG = "IndividualView"; 

private ImageView userImage; 
private Person personToDisplay; 
protected String numToCall, numtype; 
//private DatabaseHelper db; 



//private UnityMobileApp appCtx; 


protected static final int DIALOG_VIEW_CALENDAR = 2;  

protected static final int MESSAGE_CONNECTION_ERROR_TOAST = 0; 
//private static final String DEBUG_TAG = "unity.IndividualViewActivity"; 

private final Handler mHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
     case MESSAGE_CONNECTION_ERROR_TOAST: 
      Toast.makeText(getActivity(), Consts.CONNECTION_ERROR_MESSAGE, Toast.LENGTH_SHORT).show(); 
      break; 
     } 
    } 
}; 
private SharedPreferences prefs; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
super.onActivityCreated(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View view = (LinearLayout) inflater.inflate(R.layout.individual_view, container, false); 

    //db = new DatabaseHelper(appCtx); 
    // appCtx = (UnityMobileApp) getActivity().getApplication(); 

    userImage = (ImageView)getView().findViewById(R.id.individualUserImage); 
    return view; 


} 

public void onPause(){ 
    super.onPause(); 
} 

public void onDestroy(){ 
    super.onDestroy(); 
    //doUnbindService(); 
    //db.close(); 
} 

public void onResume(){ 
    super.onResume(); 

    //personToDisplay = appCtx.getEveryone().get(username); 
    updateView(); 
    //updateInfo(); 

} 


private void updateView(){ 

    userImage.setImageBitmap(personToDisplay.getRoundedImage(Consts.LARGE_USER_IMAGE_SIZE, Consts.LARGE_USER_IMAGE_BORDER)); 

} 

} 

我的清單文件低於

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.fxpal.unity.android" 
    android:versionCode="1" 
    android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="15" /> 
<application 
    android:icon="@drawable/unity_icon" 
    android:label="@string/app_name" 
    android:name=".UnityMobileApp" 
    android:theme="@android:style/Theme.Holo" android:logo="@drawable/fuji_xerox_logo_125"> 
    <activity 
     android:label="@string/app_name" 
     android:name=".MainActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".IndividualViewActivity" 
     android:label="@string/app_name" android:theme="@style/PageStyle"> 
    </activity> 
    <service android:name=".ReportingService" /> 
    <receiver android:name=".StartupReceiver"/> 
    </application> 

    </manifest> 

請幫幫我。我無法找到問題所在。

問候, 拉克什

+2

請顯示'EveryoneAdapter'類。該錯誤在其構造函數中。 – Eric 2012-07-23 19:06:51

+0

感謝Eric的回覆。我正在添加每個人適配器類 – 2012-07-23 20:05:33

回答

1

Adapter構造:

public EveryoneAdapter(Context c, UnityMobileApp a) { 
    mContext = c; 
    appCtx = a; 
    mNamesList = new ArrayList<String>(a.everyone.keySet()); // Here you call a.everyone 
} 

但是,當你調用構造函數:

gridView.setAdapter(new EveryoneAdapter(view.getContext(),appCtx)); // appCtx has not been defined 

因此,在你的構造函數,你真的叫appCtx.everyone.keySet()。由於appCtxnull(尚未由應用程序設置),它會崩潰。您需要正確創建或找到您的appCtx

+0

感謝您的信息Eric – 2012-07-23 20:51:03

+0

Eric,appCtx是我的應用程序類UnityMobileApp.java的一個應用程序對象。你能向我建議一個解決方案嗎? – 2012-07-23 21:39:09

+0

如果是擁有'Fragment'的'Activity',請嘗試'appCtx =(UnityMobileApp)getActivity();'。否則,您需要一種方法來獲取其參考。問題是你只是沒有聲明'appCtx'是什麼引用。 – Eric 2012-07-23 21:43:31