【问题标题】:transfering Text in text view from listview item from activity to a dialog box将文本视图中的文本从列表视图项从活动传输到对话框
【发布时间】:2014-03-29 20:04:07
【问题描述】:

我为此撕毁了我的头发,似乎无法让它发挥作用。我有一个具有列表视图的活动,该列表视图中的单行由三个文本视图和一个图像视图组成。我试图从单行中的一个文本视图中获取所有文本(只有一个),并在单击该项目时将其放入我的自定义对话框的文本视图中。这是我的尝试之一:(当我单击列表视图中的项目时应用程序崩溃)

    mListView.setAdapter(adapter);
    ////Attempting Onclick method \\\\
        mListView.setOnItemClickListener(new OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){

                String txt =((TextView)mListView.findViewById(R.id.title)).getText().toString();
                TextView dialogt = (TextView)findViewById(R.id.dialog_text);
                dialogt.setText(txt);
                confirmEvent();
            }
        });

如果我要 Toast txt,我会得到正确的响应,但是当我在列表中选择不同的项目时它永远不会改变。它只是永远存储它。 我的 confirmEvent() 方法实际上只是来自 android 开发者网站的自定义方法。但如果我也应该发布它,请告诉我。

/////更新////

当我按照 corsair992 的建议将 mlistview 更改为查看时,Toast 可以工作(请参阅下面的 cmets),但是当我尝试将该数据传输到我的对话框 textview 时,应用程序仍然崩溃。

下面是我的自定义对话框代码:

MyDialogFragment.java

public class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
 // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();
 // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.dialogb, null));
    builder.setMessage(R.string.dialog_Event)
           .setPositiveButton(R.string.add_to_cal, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // FIRE ZE MISSILES!
                   Toast.makeText(MyDialogFragment.this.getActivity(), "testing", Toast.LENGTH_LONG).show();
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // User cancelled the dialog
               }
           });
    // Create the AlertDialog object and return it

    return builder.create();
}
}

这是我的 confirmEvent 方法,它引用了上面的类:

public void confirmEvent() {
        DialogFragment mDialog = new MyDialogFragment();
        mDialog.show(getSupportFragmentManager(), "test");
    }

////更新///

logcat 数据:

02-26 15:21:39.359:E/AndroidRuntime(746):致命异常:主要 02-26 15:21:39.359: E/AndroidRuntime(746): java.lang.NullPointerException 02-26 15:21:39.359: E/AndroidRuntime(746): at com.wordpress.yourhappening.happening.Homepage$ListViewLoaderTask$1.onItemClick(Homepage.java:229) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 android.widget.AdapterView.performItemClick(AdapterView.java:284) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 android.widget.ListView.performItemClick(ListView.java:3382) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:1696) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 android.os.Handler.handleCallback(Handler.java:587) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 android.os.Handler.dispatchMessage(Handler.java:92) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 android.os.Looper.loop(Looper.java:123) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 android.app.ActivityThread.main(ActivityThread.java:4627) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 java.lang.reflect.Method.invokeNative(Native Method) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 java.lang.reflect.Method.invoke(Method.java:521) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 02-26 15:21:39.359: E/AndroidRuntime(746): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02-26 15:21:39.359: E/AndroidRuntime(746): at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 尝试将其更改为 view.findViewById() 而不是 mListView.findViewById()
  • 您使用自定义适配器还是简单的?
  • 感谢您的回复,我正在使用一个简单的适配器。当我更改 mListView 以查看 toast 作品时!响应会根据我选择的列表中的哪个项目而变化,就像它应该的一样!!!!但是...如果我试图将数据发送到对话框中的文本视图,它会崩溃。
  • 您应该更新您的问题并从您的 logcat 添加例外。
  • 发布您的自定义对话框代码

标签: android listview android-listview


【解决方案1】:

我认为带有“dialog_text”ID 的TextView 实际上包含在您在Dialog 中膨胀的“dialogb”布局中。如果是这种情况,那么您应该将此逻辑移至实现此功能的DialogFragment

首先您需要将文本值传递给DialogFragment。更改您的 confirmEvent() 方法以接受 CharSequence 参数并将其作为参数传递给 DialogFragment

public void confirmEvent(CharSequence text) {
    DialogFragment mDialog = new MyDialogFragment();
    Bundle args = new Bundle();
    args.putCharSequence("text", text);
    mDialog.setArguments(args);
    mDialog.show(getSupportFragmentManager(), "test");
}

然后在onCreateDialog()方法中更改以下行:

builder.setView(inflater.inflate(R.layout.dialogb, null));

到这里:

View content = inflater.inflate(R.layout.dialogb, null);
TextView dialogt = (TextView) content.findViewById(R.id.dialog_text);
dialogt.setText(getArguments().getCharSequence("text"));
builder.setView(content);

或者,如果您只需要在对话框上设置文本而不需要自定义,则可以只使用 AlertDialog 构建器上的 setMessage() 方法。

最后,去掉onItemClick()回调中的对话框文本设置逻辑,改为将文本传递给confirmEvent()方法。

我尚未测试此代码,因此可能存在一些语法错误或其他小问题,但这应该可以为您提供大致的思路。

【讨论】:

  • 我正在测试这个方法,会回复你。
  • 它工作!完美!!你是个天才,谢谢你的帮助。看来这个对我来说太高级了,我还没有完全理解你的代码,但我只是按照你的指示进行了操作。谢谢。我还读到,不能在该活动中未膨胀的布局上使用 findViewById,这是我的错误之一。
  • 如果我要更改 CharSequence,这种方法也适用于图像吗?
  • 很高兴知道它有效 - 看起来你纠正了我在“文本”键中的错字:) 你可以在 Bundle 中传递图像资源 ID 或 Uris 或 Bitmap ,但不是Drawable 本身,因此您可能应该从ListView 的原始数据源中获取您正在使用的任何一个并将它们传递给ImageView,因为ImageView 不提供用于访问它们的API .
  • 我想我最终会为此提出一个新问题,因为我似乎无法让它工作。通过我的研究,我看到传递图像的唯一方法是通过意图传递捆绑包,但我没有为此对话框使用意图。您能否更具体地说明我如何传递与当前代码相关的捆绑包?
猜你喜欢
  • 2020-12-08
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多