2013-05-12 48 views
1

我做了一个CustomTypeDialog类,我想要的是使用不在活动布局中的EditText。我尝试点击其中一个按钮时出现空指针异常,我认为这是因为它们不在活动布局中。你能帮我解决这个问题吗?该对话框在另一个类的活动中调用。Dialog +回调?

package dk.droidrun.droidrunapp; 

import android.app.Dialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageButton; 

public class CustomTypeDialog extends Dialog { 
    ImageButton routeType; 
    EditText txtType; 
    Button imageRun, imageBike, imageWalk; 
    public CustomTypeDialog(final Context context) { 
     super(context); 

     this.setContentView(R.layout.customtype_dialog); 
     routeType = (ImageButton)findViewById(R.id.saveRoute_activityType); 
     txtType = (EditText)findViewById(R.id.saveRoute_typeTxt); 
     imageRun = (Button)findViewById(R.id.dialog_btn1); 
     imageBike = (Button)findViewById(R.id.dialog_btn2); 
     imageWalk = (Button)findViewById(R.id.dialog_btn3); 

     setTitle("Select activity type"); 
     show(); 
     imageRun.setOnClickListener(new View.OnClickListener() {  
      @Override 
      public void onClick(View v) { 
       txtType.setText("Run"); 
       routeType.setBackgroundResource(R.drawable.track_run); 
      } 
     }); 

     imageBike.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       txtType.setText("Bike"); 
       routeType.setBackgroundResource(R.drawable.track_bike); 
      } 
     }); 

     imageWalk.setOnClickListener(new View.OnClickListener() {  
      @Override 
      public void onClick(View v) { 
       txtType.setText("Walk"); 
       routeType.setBackgroundResource(R.drawable.track_walk); 
      } 
     }); 
    } 

} 

这是我customtype_dialog.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".AutoMode" 
    android:background="@color/black" >  

<RelativeLayout 
    android:id="@+id/dialog_relativeLayout1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="3dp"  
    android:layout_above="@+id/dialog_relativeLayout2" 
    android:layout_centerHorizontal="true" > 

    <Button 
     android:id="@+id/dialog_btn1" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_margin="3dp" 
     android:background="@drawable/track_run" 
     android:layout_alignRight="@+id/dialog_relativeLayout1" 
     android:layout_alignTop="@+id/dialog_relativeLayout1" 
     /> 

    <Button 
     android:id="@+id/dialog_btn2" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_margin="3dp" 
     android:background="@drawable/track_bike" 
     android:layout_alignTop="@+id/dialog_relativeLayout1" 
     android:layout_toRightOf="@+id/dialog_btn1" 
     /> 

    <Button 
     android:id="@+id/dialog_btn3" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_margin="3dp" 
     android:layout_toRightOf="@+id/dialog_btn2" 
     android:background="@drawable/track_walk" 
     /> 
</RelativeLayout> 


</RelativeLayout> 

saveroutes.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="@color/black" 
    tools:context=".SaveRouteActivity" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginTop="20dp" 
     android:text="@string/saveRoute" 
     android:textColor="@color/white" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:layout_marginTop="10dip" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#7a0100" 
     android:text="Enter a name for the route" /> 

    <EditText 
     android:id="@+id/saveRoute_nameRoute" 
     android:layout_width="250dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center"   
     android:ems="10" 
     android:hint="@string/saveRoute_name" 
     android:textColor="@color/white" 
     android:background="#4e4751"  
     android:inputType="textPersonName" > 
    </EditText> 

    <TextView   
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#7a0100" 
     android:text="Describe your route" /> 

    <EditText 
     android:id="@+id/saveRoute_desciptionTxt" 
     android:layout_width="250dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:ems="10" 
     android:hint="@string/saveRoute_description" 
     android:textColor="@color/white" 
     android:background="#4e4751"  
     /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#7a0100" 
     android:text="Activity type (e.g. running)" 
     /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"  
     android:orientation="horizontal" 
     android:gravity="center_horizontal" > 

     <EditText 
      android:id="@+id/saveRoute_typeTxt" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:layout_marginTop="17dip" 
      android:ems="10" 
      android:layout_marginLeft="30dp" 
      android:hint="@string/saveRoute_type" 
      android:textColor="@color/white" 
      android:background="#4e4751"  > 

      <requestFocus /> 
     </EditText> 

     <ImageButton 
      android:id="@+id/saveRoute_activityType" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"   
      android:src="@drawable/track_walk" /> 
    </LinearLayout> 

    <Button 
     android:id="@+id/saveRoute_saveBtn" 
     android:layout_width="250dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginTop="30dp" 
     android:background="@color/white" 
     android:text="@string/saveRoute_savebutton" /> 

    <Button 
     android:id="@+id/saveRoute_cancelBtn" 
     android:layout_width="250dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginTop="30dp" 
     android:background="@color/white" 
     android:text="@string/saveRoute_cancel" /> 

</LinearLayout> 
+0

调用'setContentView'后,您无法从'main/non-active'布局查找视图。要么在构造函数中传递这两个组件,要么通过访问器方法来从对话框中操作它们。请记住,大部分必须包裹在'runOnUiThread()' – Shark 2013-05-12 13:58:36

+0

我对Android有点新,并希望在这个问题上有更多的帮助。 :) – 2013-05-12 14:00:12

+1

后logcat .. – bakriOnFire 2013-05-12 14:26:25

回答

7

无法从对话视图中使用findViewById另一个布局(您的活动)访问视图。


您需要添加一个回调监听器被点击您的对话框上的按钮时:

public interface OnDialogClickListener { 
    void onDialogImageRunClick(); 
} 

public class CustomTypeDialog extends Dialog { 
    private final OnDialogClickListener listener; 
    public CustomTypeDialog(final Context context, OnDialogClickListener listener) { 
      this.listener = listener; 
    } 

    .... 
    imageRun.setOnClickListener(new View.OnClickListener() {  
      @Override 
      public void onClick(View v) { 
        listener.onDialogImageRunClick(); 
      } 
    ); 
} 

然后,当你在你的活动创建对话框,您可以访问视图:

 new CustomTypeDialog(context, new CustomTypeDialog.OnDialogClickListener() { 
      @Override 
      public void onDialogImageRunClick() { 
        txtType.setText("Run"); 
        routeType.setBackgroundResource(R.drawable.track_run); 
      } 
     }); 
+1

感谢它像一个魅力工作。 – 2013-05-12 16:38:16