问题
I am new to android development and I've been creating an application containing two tabs . in one tab a Grid containing images will be displayed and on the other another page will be displayed . I've created 3 XML layout files and 3 java class files whose code is given below . (I'll be writing the code for pageActivity.java later on )
MainActivity.java
public class MainActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabHost tabhost = getTabHost();
TabSpec imgspec = tabhost.newTabSpec("Images");
imgspec.setIndicator("Images");
Intent imgIntent = new Intent(this,ImageAdapter.class);
imgspec.setContent(imgIntent);
TabSpec pagespec = tabhost.newTabSpec("NewPage");
pagespec.setIndicator("New Page");
Intent pageIntent = new Intent(this,pageActivity.class);
pagespec.setContent(pageIntent);
tabhost.addTab(imgspec);
tabhost.addTab(pagespec);
}
}
ImageAdapter.java
public class ImageAdapter extends BaseAdapter {
Context mContext;
public Integer[] mThumbIds = {R.drawable.ic_action_search , R.drawable.ic_launcher , R.drawable.img1 };
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount(){
return mThumbIds.length ;
}
public Object getItem(int position){
return mThumbIds[position];
}
public View getView(int position , View convertView , ViewGroup parent){
ImageView imageView = new ImageView(mContext);
imageView.setImageResource(mThumbIds[position]);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setLayoutParams(new GridView.LayoutParams(70, 70));
return imageView;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
}
pageActivity.java
public class pageActivity extends Activity {
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_height="fill_parent"
android:layout_width="fill_parent"/>
</LinearLayout>
</TabHost>
img_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</GridView>
page_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
At runtime , the application crashes . After looking at the LogCat it seems that the problem is with the ImageAdapter.java file . Please Help .
The LogCat error is shown below
08-27 19:16:14.772: E/AndroidRuntime(390): FATAL EXCEPTION: main
08-27 19:16:14.772: E/AndroidRuntime(390): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.prac1/com.example.prac1.MainActivity}: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.prac1/com.example.prac1.ImageAdapter}: java.lang.InstantiationException: com.example.prac1.ImageAdapter
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.os.Handler.dispatchMessage(Handler.java:99)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.os.Looper.loop(Looper.java:130)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-27 19:16:14.772: E/AndroidRuntime(390): at java.lang.reflect.Method.invokeNative(Native Method)
08-27 19:16:14.772: E/AndroidRuntime(390): at java.lang.reflect.Method.invoke(Method.java:507)
08-27 19:16:14.772: E/AndroidRuntime(390): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-27 19:16:14.772: E/AndroidRuntime(390): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-27 19:16:14.772: E/AndroidRuntime(390): at dalvik.system.NativeStart.main(Native Method)
08-27 19:16:14.772: E/AndroidRuntime(390): Caused by: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.prac1/com.example.prac1.ImageAdapter}: java.lang.InstantiationException: com.example.prac1.ImageAdapter
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1487)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.widget.TabHost.setCurrentTab(TabHost.java:326)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.widget.TabHost.addTab(TabHost.java:216)
08-27 19:16:14.772: E/AndroidRuntime(390): at com.example.prac1.MainActivity.onCreate(MainActivity.java:32)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-27 19:16:14.772: E/AndroidRuntime(390): ... 11 more
08-27 19:16:14.772: E/AndroidRuntime(390): Caused by: java.lang.InstantiationException: com.example.prac1.ImageAdapter
08-27 19:16:14.772: E/AndroidRuntime(390): at java.lang.Class.newInstanceImpl(Native Method)
08-27 19:16:14.772: E/AndroidRuntime(390): at java.lang.Class.newInstance(Class.java:1409)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
08-27 19:16:14.772: E/AndroidRuntime(390): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
08-27 19:16:14.772: E/AndroidRuntime(390): ... 20 more
回答1:
Your problem is that ImageAdapter
is not an Activity
and therefore Android has no idea how to instantiate it as though it were one.
You'll need to create an Activity
which holds your ImageAdapter
and within that Activity
set the adapter on its GridView
.
First, change img_layout.xml to this:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/img_grid"
android:layout_width="match_parent"
android:layout_height="match_parent" >
Let's call your new Activity ImageGridActivity
. Within your ImageGridActivity.onCreate()
you'll do:
setContentView(R.id.img_layout);
GridView grid = (GridView)findViewById(R.id.img_grid);
grid.setAdapter(new ImageAdapter(this));
回答2:
You are trying to set one of the tabs with ImageAdapter
, but ImageAdapter
is not an Activity
. You can only set Activity classes as a tab. So Remove the below code
Intent imgIntent = new Intent(this,ImageAdapter.class);
imgspec.setContent(imgIntent);
来源:https://stackoverflow.com/questions/12143127/tab-application-crash-during-runtime