问题
Update:
The compile error is resolved and I found some things I didn't do right orgianlly based off the example I was following and corrected them. However when I try to run the code I get the following error. When I line by through the code I have noticed that the createTabContent inside the NewTab.setContent doesn't execute because my breakpoint in there is never tripped.
01-12 10:11:21.285: E/AndroidRuntime(14528): FATAL EXCEPTION: main
01-12 10:11:21.285: E/AndroidRuntime(14528): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jackman.universalav/com.jackman.universalav.MainActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x0
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.app.ActivityThread.access$600(ActivityThread.java:140)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.os.Handler.dispatchMessage(Handler.java:99)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.os.Looper.loop(Looper.java:137)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.app.ActivityThread.main(ActivityThread.java:4898)
01-12 10:11:21.285: E/AndroidRuntime(14528): at java.lang.reflect.Method.invokeNative(Native Method)
01-12 10:11:21.285: E/AndroidRuntime(14528): at java.lang.reflect.Method.invoke(Method.java:511)
01-12 10:11:21.285: E/AndroidRuntime(14528): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
01-12 10:11:21.285: E/AndroidRuntime(14528): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
01-12 10:11:21.285: E/AndroidRuntime(14528): at dalvik.system.NativeStart.main(Native Method)
01-12 10:11:21.285: E/AndroidRuntime(14528): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.content.res.Resources.getValue(Resources.java:1026)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.content.res.Resources.loadXmlResourceParser(Resources.java:2131)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.content.res.Resources.getLayout(Resources.java:865)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.widget.TabHost$LabelIndicatorStrategy.createIndicatorView(TabHost.java:554)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.widget.TabHost.addTab(TabHost.java:234)
01-12 10:11:21.285: E/AndroidRuntime(14528): at com.jackman.universalav.MainActivity.onCreate(MainActivity.java:71)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.app.Activity.performCreate(Activity.java:5191)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
01-12 10:11:21.285: E/AndroidRuntime(14528): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
01-12 10:11:21.285: E/AndroidRuntime(14528): ... 11 more
The updated code is:
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Create the tab host that contains the tab widget that contains the tabs
TabHost Tabs = new TabHost(this);
Tabs.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//Create the tab widget container
TabWidget TabWidget = new TabWidget(this);
TabWidget.setId(android.R.id.tabs);
Tabs.addView(TabWidget, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//the tab host needs a frame layout for the views associated with each visible tab
FrameLayout frameLayout = new FrameLayout(this);
frameLayout.setId(android.R.id.tabcontent);
frameLayout.setPadding(0, 65, 0, 0);
Tabs.addView(frameLayout, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Tabs.setup();
//Create the tabs
DatabaseHelper dbHelper = new DatabaseHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
String dbQuery = "SELECT * FROM " + dbHelper.System_Table + " AS s JOIN " + dbHelper.Devices_Table + " AS d ON s." + dbHelper.Attribute_Device_ID +
" = d." + dbHelper.Attribute_Device_ID + ";";
Cursor c = db.rawQuery(dbQuery, null);
if (c.getCount() > 0)
{
while (c.moveToNext())
{
int iColumnDeviceType = c.getColumnIndex(dbHelper.Attribute_Device_Type);
int iColumnDeviceName = c.getColumnIndex(dbHelper.Attribute_Device_Name);
final String DeviceType = c.getString(iColumnDeviceType);
String DeviceName = c.getString(iColumnDeviceName);
String DeviceNameLabel = DeviceName.replaceAll(" ", "");
TabSpec NewTab = Tabs.newTabSpec("tab" + DeviceNameLabel);
NewTab.setIndicator(DeviceNameLabel);
NewTab.setContent(new TabHost.TabContentFactory()
{
public View createTabContent(String tag)
{
LinearLayout ll = new LinearLayout(MainActivity.this);
LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
ll.setLayoutParams(params);
ll.setOrientation(LinearLayout.VERTICAL);
if (DeviceType == "Receiver")
{
}
else if (DeviceType == "Video Player")
{
}
return ll;
}
});
Tabs.addTab(NewTab);
}
}
}
}
End Update
Orginal question below:
I haven't got to the point where this routine is finished yet.
I was trying to follow a sample of code from this link. http://www.pocketmagic.net/2010/01/android-dynamic-tab-control/
However when I attempt to create a linearlayout for the tab being created the compiler freaks out on me. I'm not sure why it is throwing the error. It's like the object I made one line ago doesn't exist.
The returned errors are:
Multiple markers at this line
- Syntax error on token(s), misplaced construct(s)
- Syntax error on token "params", VariableDeclaratorId expected after this token
Anyways the code is below. Can anyone see what I am doing wrong?
//Create the tab host that contains the tab widget that contains the tabs
TabHost Tabs = new TabHost(this);
Tabs.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//Create the tab widget container
TabWidget TabWidget = new TabWidget(this);
TabWidget.setId(android.R.id.tabs);
Tabs.addView(TabWidget, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
Tabs.setup();
//Create the tabs
DatabaseHelper dbHelper = new DatabaseHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
String dbQuery = "SELECT * FROM " + dbHelper.System_Table + " AS s JOIN " +
dbHelper.Devices_Table + " AS d ON s." + dbHelper.Attribute_Device_ID +
" = d." + dbHelper.Attribute_Device_ID + ";";
Cursor c = db.rawQuery(dbQuery, null);
if (c.getCount() > 0)
{
while (c.moveToNext())
{
int iColumnDeviceType = c.getColumnIndex(dbHelper.Attribute_Device_Type);
int iColumnDeviceName = c.getColumnIndex(dbHelper.Attribute_Device_Name);
final String DeviceType = c.getString(iColumnDeviceType);
String DeviceName = c.getString(iColumnDeviceName);
String DeviceNameLabel = DeviceName.replaceAll(" ", "");
TabSpec NewTab = Tabs.newTabSpec("tab" + DeviceNameLabel);
NewTab.setIndicator(DeviceName);
NewTab.setContent(new TabHost.TabContentFactory()
{
LinearLayout ll = new LinearLayout(MainActivity.this);
LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
ll.setLayoutParams(params); //this line has both of the errors
public View createTabContent(String tag)
{
if (DeviceType == "Receiver")
{
}
else if (DeviceType == "Video Player")
{
}
return null; //place holder until I finish the routine
}
});
Tabs.addTab(NewTab);
}
}
回答1:
I figured out the issue after much trial and error and googling an extensive ammount of examples.
First I gave up attempting to create the tab widget and the frame layout through java instead of xml for the activity..
In my activities layout xml file I added a tab control and in the xml view deleted the tabs leaving the xml code looking like this.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
<LinearLayout
android:id="@+id/MainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
</TabHost>
</RelativeLayout>
Then in the java file for the activity I updated the oncreate routine to be this.
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Create the tabs
TabHost Tabs = (TabHost) findViewById(android.R.id.tabhost);
Tabs.setup();
DatabaseHelper dbHelper = new DatabaseHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
String dbQuery = "SELECT * FROM " + dbHelper.System_Table + " AS s JOIN " +
dbHelper.Devices_Table + " AS d ON s." + dbHelper.Attribute_Device_ID +
" = d." + dbHelper.Attribute_Device_ID + ";";
Cursor c = db.rawQuery(dbQuery, null);
int Count = 0;
if (c.getCount() > 0)
{
while (c.moveToNext())
{
Count = Count + 1;
int iColumnDeviceType = c.getColumnIndex(dbHelper.Attribute_Device_Type);
int iColumnDeviceName = c.getColumnIndex(dbHelper.Attribute_Device_Name);
final String DeviceType = c.getString(iColumnDeviceType);
final String DeviceName = c.getString(iColumnDeviceName);
final String DeviceNameLabel = DeviceName.replaceAll(" ", "");
Log.d("Creating Tab", "TabSpec: tab" + DeviceNameLabel);
Log.d("Creating Tab", "Indicator: " + DeviceName);
final TabSpec NewTab = Tabs.newTabSpec("tab" + DeviceNameLabel);
NewTab.setIndicator(DeviceName);
NewTab.setContent(new TabHost.TabContentFactory()
{
@Override
public View createTabContent(String tag)
{
LinearLayout ll = new LinearLayout(MainActivity.this);
LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
ll.setLayoutParams(params);
ll.setOrientation(LinearLayout.VERTICAL);
if (DeviceType.equals("Receiver"))
{
final Button btnVolumeUp = new Button(MainActivity.this);
btnVolumeUp.setText("Volume Up");
btnVolumeUp.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
btnVolumeUp.setGravity(Gravity.LEFT);
ll.addView(btnVolumeUp);
}
else if (DeviceType.equals("Video Player"))
{
final Button btnPlay = new Button(MainActivity.this);
btnPlay.setText("Play");
btnPlay.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
btnPlay.setGravity(Gravity.LEFT);
ll.addView(btnPlay);
}
return ll;
}
});
Tabs.addTab(NewTab);
}
}
来源:https://stackoverflow.com/questions/14251003/trying-to-generate-tabs-and-their-views-dynamically