【发布时间】:2011-08-15 15:18:05
【问题描述】:
我决定创建一些自定义对话框类,这些类可以在不同情况下由不同的活动通用使用。具体来说,我创建了一个对话框,其中包含一个 EditText 框和这样的标题:
public class EditTextDialogFragment extends DialogFragment {
// Factory method to create a new EditTextDialogFragment
public static EditTextDialogFragment newInstance( int title, int defaultText ) {
EditTextDialogFragment frag = new EditTextDialogFragment( );
Bundle args = new Bundle( );
args.putInt( "title", title );
args.putInt( "defaultText", defaultText );
frag.setArguments( args );
return frag;
}
// Set title and default text
@Override
public Dialog onCreateDialog( Bundle savedInstanceState ) {
// Set an EditText view to get user input
EditText inputView = new EditText( getActivity( ) );
inputView.setHint( getArguments( ).getInt( "defaultText" ) );
AlertDialog.Builder builder = new AlertDialog.Builder( getActivity( ) )
.setIcon( android.R.drawable.ic_dialog_alert )
.setTitle( getArguments( ).getInt( "title" ) )
.setPositiveButton( R.string.ok, ( DialogInterface.OnClickListener )getActivity( ) )
.setNegativeButton( R.string.cancel, ( DialogInterface.OnClickListener )getActivity( ) )
.setView( inputView );
return builder.create( );
}
}
另请注意,我正在按照最新 Android SDK 中的建议使用 DialogFragments 来执行此操作。
无论如何,我的想法是,从任何活动中我都可以这样调用:
EditTextDialogFragment etdf = EditTextDialogFragment.newInstance( R.string.add_new_term, R.string.term_name );
etdf.show( getSupportFragmentManager( ), "new_term" );
只要我在 Activity 中实现 DialogInterface.OnClickListener,我就会在用户完成对话框时得到回调。所以我的 Activity 中有这个方法:
@Override
public void onClick( DialogInterface dialog, int whichButton ) {
if ( whichButton == DialogInterface.BUTTON_POSITIVE ) {
Toast.makeText( getApplicationContext( ), "Dialog finished!", Toast.LENGTH_SHORT ).show( );
}
}
我在“是/否”对话框中使用了完全相同的设计,效果很好,我喜欢它。我只需两行代码就可以轻松地从任何活动中调用它,并显示带有自定义标题的是/否对话框。然后 onClick 回调包含按下了哪个按钮,所以我从对话框中获得了我需要的所有信息。
但是,对于这个 EditText 对话框,我不知道如何从 OnClick 方法内的 EditText 框中获取数据。唯一传回的是按下的按钮和一个 DialogInterface 引用(据我所知,这无助于我获取 EditText 数据)。
我见过的唯一解决方案是将 OnClickListener 代码嵌入到构建器代码中,如下所示:
builder.setItems(terms, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText( getApplicationContext( ), inputView.getText().toString(), Toast.LENGTH_SHORT ).show( );
}
});
但这违背了创建一个通用对话框类的全部目的,该类可以在任何需要编辑框的活动中使用。我错过了一些明显的东西吗?这不可能吗?
【问题讨论】: