好的,这里是自定义对话框类的完整工作代码,其中包含一个包含 listView 的选项卡式布局。第一个选项卡有一个 listView ,其中行是 textView 和 imageView ,其中 imageView 是右对齐的。第二个选项卡有一个 listView,其中行是一个 textView。滚动条设置为较长的淡入淡出持续时间,以使其始终显示。对话框窗口本身设置为静态大小,以防止对话框在切换选项卡时调整大小。对话窗口也位于屏幕下方,而不是中心。listViews 使用自定义适配器,并且第二个选项卡的 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;
}
}