OK這裏是一個自定義對話框類的完整工作代碼,其中包含一個包含listView的選項卡式佈局。第一個選項卡具有listView,其中行是textView,imageView是右對齊的。第二個選項卡有一個listView,其中行是單個textView。滾動條設置爲高褪色持續時間以使其始終顯示。對話框窗口本身設置爲靜態大小,以防止在切換選項卡時調整對話框的大小。對話窗口也位於屏幕下方,而不是中心。 listView使用自定義適配器,第二個選項卡的listView被註冊爲上下文菜單。
我已將所有內容重新命名爲更通用,並且其中包含我們產品的名稱,所以我在重命名時可能會犯一些錯別字,但我認爲一切正常。試圖盡我所能評論代碼。希望這有助於一些人。
的customDialog的XML(custom_dialog_layout.xml):
<?xml version="1.0" encoding="utf-8"?>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TabHost01"
android:layout_width="fill_parent"
android:layout_height="300dip">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ListView
android:id="@+id/listView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:scrollbarFadeDuration="1000000"/>
<ListView
android:id="@+id/listView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:scrollbarFadeDuration="1000000"/>
</FrameLayout>
</LinearLayout>
</TabHost>
標籤1個的ListView行XML(list_view_01_row.xml)。這是一個textView,左對齊和一個imageView,右對齊。 textView已被設置爲更高的高度,以強制listView行更高。 listView也被設置爲特定的寬度,這會將imageView向右推,以便將其右對齊。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="5dip"
android:paddingTop="5dip"
android:paddingLeft="10dip"
android:paddingRight="10dip">
<TableLayout
android:id="@+id/list_view_01_row_table_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="0">
<TableRow
android:id="@+id/list_view_01_row_table_row"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/list_view_01_row_text_view"
android:textSize="18sp"
android:textColor="#ffffff"
android:gravity="center_vertical"
android:layout_width="200dip"
android:layout_height="75dip" />
<ImageView
android:id="@+id/list_view_01_row_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
</TableLayout>
</LinearLayout>
選項卡2 listView行XML(list_view_02_row.xml)。與標籤1相同,但使用單個textView,不使用imageView。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="5dip"
android:paddingTop="5dip"
android:paddingLeft="10dip"
android:paddingRight="10dip">
<TableLayout
android:id="@+id/list_view_02_row_table_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="0">
<TableRow
android:id="@+id/list_view_02_row_table_row"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/list_view_02_row_text_view"
android:textSize="18sp"
android:textColor="#ffffff"
android:gravity="center_vertical"
android:layout_width="fill_parent"
android:layout_height="75dip" />
</TableRow>
</TableLayout>
</LinearLayout>
最後是自定義的Dialog類。
import android.app.Dialog;
import android.content.Context;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TextView;
/**
* This is a custom dialog class that will hold a tab view with 2 tabs.
* Tab 1 will be a list view. Tab 2 will be a list view.
*
*/
public class CustomDialog extends Dialog
{
/**
* Our custom list view adapter for tab 1 listView (listView01).
*/
ListView01Adapter listView01Adapter = null;
/**
* Our custom list view adapter for tab2 listView (listView02).
*/
ListView02Adapter listView02Adapter = null;
/**
* Default constructor.
*
* @param context
*/
public CustomDialog(Context context)
{
super(context);
// get this window's layout parameters so we can change the position
WindowManager.LayoutParams params = getWindow().getAttributes();
// change the position. 0,0 is center
params.x = 0;
params.y = 250;
this.getWindow().setAttributes(params);
// no title on this dialog
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.custom_dialog_layout);
// instantiate our list views for each tab
ListView listView01 = (ListView)findViewById(R.id.listView01);
ListView listView02 = (ListView)findViewById(R.id.listView02);
// register a context menu for all our listView02 items
registerForContextMenu(listView02);
// instantiate and set our custom list view adapters
listView01Adapter = new ListView01Adapter(context);
listView01.setAdapter(listView01Adapter);
listView02Adapter = new ListView02Adapter(context);
listView02.setAdapter(listView02Adapter);
// bind a click listener to the listView01 list
listView01.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> parentView, View childView, int position, long id)
{
// will dismiss the dialog
dismiss();
}
});
// bind a click listener to the listView02 list
listView02.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> parentView, View childView, int position, long id)
{
// will dismiss the dialog
dismiss();
}
});
// get our tabHost from the xml
TabHost tabs = (TabHost)findViewById(R.id.TabHost01);
tabs.setup();
// create tab 1
TabHost.TabSpec tab1 = tabs.newTabSpec("tab1");
tab1.setContent(R.id.listView01);
tab1.setIndicator("List 1");
tabs.addTab(tab1);
// create tab 2
TabHost.TabSpec tab2 = tabs.newTabSpec("tab2");
tab2.setContent(R.id.listView02);
tab2.setIndicator("List 2");
tabs.addTab(tab2);
}
/**
* A custom list adapter for the listView01
*/
private class ListView01Adapter extends BaseAdapter
{
public ListView01Adapter(Context context)
{
}
/**
* This is used to return how many rows are in the list view
*/
public int getCount()
{
// add code here to determine how many results we have, hard coded for now
return 10;
}
/**
* Should return whatever object represents one row in the
* list.
*/
public Object getItem(int position)
{
return position;
}
/**
* Used to return the id of any custom data object.
*/
public long getItemId(int position)
{
return position;
}
/**
* This is used to define each row in the list view.
*/
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
// our custom holder will represent the view on each row. See class below.
ListView01Holder holder = null;
if(row == null)
{
LayoutInflater inflater = getLayoutInflater();
// inflate our row from xml
row = inflater.inflate(R.layout.list_view_01_row, parent, false);
// instantiate our holder
holder = new ListView01Holder(row);
// set our holder to the row
row.setTag(holder);
}
else
{
holder = (ListView01Holder)row.getTag();
}
return row;
}
// our custom holder
class ListView01Holder
{
// text view
private TextView text = null;
// image view
private ImageView image = null;
ListView01Holder(View row)
{
// get out text view from xml
text = (TextView)row.findViewById(R.id.image);
// add code here to set the text
text.setText("");
// get our image view from xml
image = (ImageView)row.findViewById(R.id.list_view_01_row_image_view);
// add code here to determine which image to load, hard coded for now
rating.setImageResource(R.drawable.image);
}
}
}
/**
* A custom list adapter for listView02
*/
private class ListView02Adapter extends BaseAdapter
{
public ListView02Adapter(Context context)
{
}
/**
* This is used to return how many rows are in the list view
*/
public int getCount()
{
// add code here to determine how many results we have, hard coded for now
return 5;
}
/**
* Should return whatever object represents one row in the
* list.
*/
public Object getItem(int position)
{
return position;
}
/**
* Used to return the id of any custom data object.
*/
public long getItemId(int position)
{
return position;
}
/**
* This is used to define each row in the list view.
*/
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
ListView02Holder holder = null;
if(row == null)
{
LayoutInflater inflater = getLayoutInflater();
row=inflater.inflate(R.layout.list_view_02_row, parent, false);
holder = new ListView02Holder(row);
row.setTag(holder);
}
else
{
holder = (ListView02Holder)row.getTag();
}
return row;
}
class ListView02Holder
{
private TextView text = null;
ListView02Holder(View row)
{
text = (TextView)row.findViewById(R.id.list_view_02_row_text_view);
text.setText("");
}
}
}
/**
* This is called when a long press occurs on our listView02 items.
*/
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Context Menu");
menu.add(0, v.getId(), 0, "Delete");
}
/**
* This is called when an item in our context menu is clicked.
*/
public boolean onContextItemSelected(MenuItem item)
{
if(item.getTitle() == "Delete")
{
}
else
{
return false;
}
return true;
}
}
我想你會問太多的對話框。在對話框中有2個選項卡和2個列表視圖?真? – Falmarri 2010-12-20 17:41:34
工作很好,除了滾動條問題 – Bob 2010-12-20 17:56:05