【问题标题】:How to get data out of a general-purpose dialog class如何从通用对话框类中获取数据
【发布时间】: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( );
        }
    });

但这违背了创建一个通用对话框类的全部目的,该类可以在任何需要编辑框的活动中使用。我错过了一些明显的东西吗?这不可能吗?

【问题讨论】:

    标签: android dialog


    【解决方案1】:

    这是一个非常常见的问题,实际上有一个非常简单的解决方案。您只需要使用新的 Dialog 作为视图来获取控件。

    像这样..

    EditText editTextFromDialog = (EditText)dialog.findViewById(the_editText_ID);
    

    然后在您的 onclick 处理程序中,只要您在声明的控件范围内(如果不是,您将不得不修改范围以满足您的需要,您可以获取内容。

    String dialogInput = editTextFromDialog.getText().toString();
    

    【讨论】:

    • 明确地说,对于任何阅读本文的人,在调用 findViewById 之前,需要将对话框转换为 Dialog 对象。对话框作为 DialogInterface 引用出现,findViewById 未定义。
    • @Clarence Simpson 很好的说明!
    • @ClarenceSimpson 它应该类似于EditText editTextFromDialog = (EditText)dialog.getDialog().findViewById(the_editText_ID); 没有“对话”演员。只是“EditText”。
    【解决方案2】:

    优秀,

    我在 Activity 中实现了 onclick 方法,它可以工作:

    public class MainActivity extends FragmentActivity implements OnClickListener {
    
      protected void button1ActionPerformed() {
            // TODO Auto-generated method stub
            newFragment = new InputDialogFragment().newInstance( R.string.send_trasnsactions, R.string.dialog_fire_missiles, R.string.dialog_fire_missiles );
            newFragment.show(getSupportFragmentManager(), "missiles");
    
        }
    
     @Override
        public void onClick( DialogInterface dialog, int whichButton ) {
            Dialog x = (Dialog)dialog;
            EditText editTextFromDialog = (EditText)x.findViewById(2000);
            if ( whichButton == DialogInterface.BUTTON_POSITIVE ) {
                Log.i("x:"+editTextFromDialog.getText().toString(), "Ok");
            }else{
                Log.i("x", "cancel");
            }
        } 
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多