2011-02-05 161 views
2

如何通过setOnItemClickListener从ListView打开新窗口(TextView)? 我已经尝试过,但它是失败的。我有两个Xml文件(我不知道我是否可以有2),并在第二个XML文件是TextView。我想如果我点击ListView中的任何项目,它将打开与TextView的新窗口。OnItemClickListener - 打开新窗口

还有就是我的尝试:

list.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View view, int position, 
        long id) { 
       TextView message = (TextView)findViewById(R.id.message); 
       Uri uriSMSURIs = Uri.parse("content://sms/inbox"); 
       Cursor c = getContentResolver().query(uriSMSURIs, null, null, null, null); 
       String bodys = c.getString(c.getColumnIndexOrThrow("body"));   
       setContentView(R.layout.text); ----> this is name of second Xml file "Text.xml" 
       message.setText(bodys); 

      } 

     }); 
+1

你需要解释如何 “它的失败”。您还应该浏览调试器中的代码或添加println语句来告诉您是否调用了回调`onItemClick`。同时查看LogCat以查看是否有任何相关的错误消息或异常记录。 – 2011-02-05 16:04:24

+0

我也推荐学习Logcat。听起来你可能已经看到了这种情况,如果你从应用程序崩溃中看到堆栈跟踪。干杯! – Devunwired 2011-02-05 16:49:08

回答

1

如果你想在一个AlertDialog方面一个新的窗口,那么你应该通过阅读这个例子创建一个:creating AlertDialogs

否则,如果你想创建一个新的活动,然后我将做到以下几点:

list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, int position, 
       long id) { 

      Uri uriSMSURIs = Uri.parse("content://sms/inbox"); 
      Cursor c = getContentResolver().query(uriSMSURIs, null, null, null, null); 
      String bodys = c.getString(c.getColumnIndexOrThrow("body"));   


      Intent textIntent = new Intent(view.getContext(), TextMessage.class); 
      textIntent.putExtra(thisClass.class.getName(),bodys); 
      thisClass.this.stratActivity(textIntent); 

     } 

    }); 

有了这个,现在你可以定义一个名为TextMessage的一个新的Activity类,它应该是这个样子:

public class TextMessage extends Activity 
{ 
    public void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.text); 
    TextView message = (TextView)findViewById(R.id.message); 

    Intent intent = getIntent(); 
    String bodys = intnet.getExtras().getString(thisClass.class.getName()); 
    message.setText(bodys); 


} 

这应该为你做好诀窍。

p.s.一定要在AndroidManifest.xml文件中声明TextMessage类

1

我想你应该看看AlertDialog.Builder然后搜索如何建立一个AlertDialog有一个EditText场的例子。

2

我不确定你遇到的确切故障是什么,但是我的猜测类似于NullPointerException,因为你在做某些操作的顺序。我注意到的第一件事是代码中的findViewById(),setContentView()setText()的顺序。

findViewById()遍历当前加载的内容视图层次结构,搜索您引用的ID。因此,在加载正确的视图层次结构之前,搜索TextView引用会产生错误的结果(它将返回null,除非在之前的布局中具有相同ID的视图,在这种情况下,您将看到错误的视图)。因此,在调用setText()时,您要么设置错误视图的文本,要么根本没有视图(NullPointerException)。

为了实现你的目标,你的方法应该看起来更像是这样的:

public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { 
    setContentView(R.layout.text);   
    //Search after the layout is inflated and attached 
    TextView message = (TextView)findViewById(R.id.message); 

    Uri uriSMSURIs = Uri.parse("content://sms/inbox"); 
    Cursor c = getContentResolver().query(uriSMSURIs, null, null, null, null); 
    String bodys = c.getString(c.getColumnIndexOrThrow("body"));   

    message.setText(bodys); 
} 

作为一个方面说明,这是谷歌建议启动一个新的活动(真正的更像是“打开新窗口”)的原因而不是总是重新加载内容视图(就像哈坎建议你做的那样)。人们经常感到困惑,当内容视图重置时,他们的所有视图引用都不再有效。

希望有帮助!如果不是的话,我们都会对你遇到的确切故障有更多的解释。

+0

Thanks.But它并没有解决这个问题。 – Adam 2011-02-05 17:19:33

1

确定简单的方法是确保被调用的活动扩展ListActivity。

EG:

public Class activity2 extends ListActiivty{ 

    code goes here 
    }