简体   繁体   中英

Set custom dialog once into activity

I have listactivity consist of multiple row each row open activity which contain text and two button one of them open infinite gallery the other one open dialog ,and each dialog had different string ,

i have 20 row so i add dialog 20 times which is redundant , also its work fine but i think there is better approach than what i did ,

any help to get it will be appreciated , thanks

MyDay class:

public class MyDay extends Activity {
final Context context = this;
private Button button;
TextView tv1,tv2,tv3,tv4;
String day;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.Layou
          tParams.FLAG_FULLSCREEN); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    Boolean customTitleSupported =       
         requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);     
    setContentView(R.layout.day);  

    if (customTitleSupported) {          
     getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title);  } 

    initializeTextViews(); }

private void initializeTextViews() {
    tv1=(TextView)findViewById(R.id.title_tv1); 
    tv1.setTypeface(FontFactory.getBFantezy(getBaseContext()));

    tv2=(TextView)findViewById(R.id.day_tv1);
    tv2.setTypeface(FontFactory.getBFantezy(getBaseContext()));

    tv3=(TextView)findViewById(R.id.day_tv3);
    tv3.setTypeface(FontFactory.getBFantezy(getBaseContext()));

     day=getIntent().getStringExtra("cheese");

    if(day.equalsIgnoreCase("Day1")){
        tv1.setText("First Day");       
        tv2.setText(Html.fromHtml(getString(R.string.beginning)));  
        tv3.setText(Html.fromHtml(getString(R.string.day1))); 

        button = (Button) findViewById(R.id.city_button);        
        button.setOnClickListener(new OnClickListener() { 
      public void onClick(View arg0) { 
        // custom dialog
        final Dialog dialog = new Dialog(context,R.style.cust_dialog);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);           
        dialog.setContentView(R.layout.custom_dialog); 
        // set the custom dialog components - text, image and button
        TextView text = (TextView) dialog.findViewById(R.id.dialog_text);
        text.setTypeface(FontFactory.getBFantezy(getBaseContext()));                
        text.setText(Html.fromHtml(getString(R.string.torusim_places_1)));

    Button dialogButton = (Button) dialog.findViewById(R.id.dialog_Button);             
                dialogButton.setTypeface(FontFactory.getBFantezy(getBaseContext()));
        // if button is clicked, close the custom dialog
        dialogButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                dialog.dismiss();}
                         });
                dialog.show(); }
                         }); }

     else if(day.equalsIgnoreCase("Day2")){
        tv1.setText("Second Day");
        tv2.setText(Html.fromHtml(getString(R.string.beginning)));
        tv3.setText(Html.fromHtml(getString(R.string.day2))); 

        button = (Button) findViewById(R.id.city_button);        
        button.setOnClickListener(new OnClickListener() {    
          public void onClick(View arg0) {   
            // custom dialog
        final Dialog dialog = new Dialog(context,R.style.cust_dialog);                  
                 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);          
         dialog.setContentView(R.layout.custom_dialog);  

    TextView text = (TextView) dialog.findViewById(R.id.dialog_text);               
              text.setTypeface(FontFactory.getBFantezy(getBaseContext()));              
        text.setText(Html.fromHtml(getString(R.string.torusim_places_2)));

    Button dialogButton = (Button) dialog.findViewById(R.id.dialog_Button);         
         dialogButton.setTypeface(FontFactory.getBFantezy(getBaseContext()));
            // if button is clicked, close the custom dialog
            dialogButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    dialog.dismiss(); }
                            });  
                    dialog.show(); }
                        }); }
     else if(day.equalsIgnoreCase("Day3")){
        tv1.setText("Third Day");
        tv2.setText(Html.fromHtml(getString(R.string.beginning)));
        tv3.setText(Html.fromHtml(getString(R.string.day3))); 

        button = (Button) findViewById(R.id.city_button);        
        button.setOnClickListener(new OnClickListener() {    
          public void onClick(View arg0) {   
        // custom dialog
        final Dialog dialog = new Dialog(context,R.style.cust_dialog);
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);           
                dialog.setContentView(R.layout.custom_dialog);                  
        TextView text = (TextView) dialog.findViewById(R.id.dialog_text);               
                  text.setTypeface(FontFactory.getBFantezy(getBaseContext()));              
               text.setText(Html.fromHtml(getString(R.string.torusim_places_3)));

    Button dialogButton = (Button) dialog.findViewById(R.id.dialog_Button);             
            dialogButton.setTypeface(FontFactory.getBFantezy(getBaseContext()));
            // if button is clicked, close the custom dialog
        ialogButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    dialog.dismiss(); }
                            });  
                    dialog.show(); }
                        }); 
                                   }
                                 }

  // this continuing repeated till day 20 // 

 public void handleClick(View v){

    //Create an intent to start the new activity.

    Intent intent = new Intent();
    intent.setClass(this,DayGallery.class);
    intent.putExtra("dayname",day);
    startActivity(intent);

                  }
            }

You have a lot of duplicating code. I suggest change intent day indicating extra type to int, and put your text resources into arrays with index = day number - 1.

Also it is easier to read and maintain code if you implement onClickListener interface in your activity class instead of creating new object.

Here is refactored version of your code, much shorter and clearer:

public class MyDay extends Activity implements View.OnClickListener {
    private Context mContext = this;
    private Button mButton;
    private TextView tv1, tv2, tv3, tv4;
    private int  dayNumber;
    private Dialog mDialog;
    // this string should be in resources, like other below
    private final String[] tv1Resources = {"First day", "Second day", "Third day" , ...}; 
    private final int[] tv3Resources = {R.string.day1, R.string.day2, R.string.day3 , ...};
    private final int[] dialogTextResources = {R.string.torusim_places_1, R.string.torusim_places_2, R.string.torusim_places_3 , ...};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN); 
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        Boolean customTitleSupported =       
                requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);     
        setContentView(R.layout.day);  

        if (customTitleSupported) {          
            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title);  } 

            // note, now you should put integer extra, 
            //not String, this extra is just day number -1, 
            //for day1 this is 0, for day2 this is 1 etc. 
            //In your case, probably this number == item position in listview of 
        dayNumber = getIntent().getIntExtra("cheese", -1); previous activity
        if (dayNumber == -1){
            finish(); //this needed if somehow you get invalid extra
            return;
        }

        initializeTextViews();
    }

    @Override
    public void onClick(View v) {       
        switch (v.getId()){
            //actually this switch isn't needed because you have 
            //only one button in this activity, but I wanted to show,
            // how you can maintain many onClick events here
        case R.id.city_button: 
            // custom dialog
                    // we use class field for avoid making final dialog local variable
            mDialog = new Dialog(mContext, R.style.cust_dialog); 

            mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            mDialog.setContentView(R.layout.custom_dialog);
            // set the custom dialog components - text, image and button
            TextView text = (TextView) mDialog.findViewById(R.id.dialog_text);
            text.setTypeface(FontFactory.getBFantezy(getBaseContext()));
            text.setText(Html.fromHtml(getString(dialogTextResources[dayNumber])));

            Button dialogButton = (Button) mDialog.findViewById(R.id.dialog_Button);
            dialogButton.setTypeface(FontFactory.getBFantezy(getBaseContext()));
            // if button is clicked, close the custom dialog
            dialogButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    if (mDialog != null) mDialog.dismiss(); // check for aviod dialog null pointer
                }
            });
            mDialog.show(); 
            break;
        }
    }

    private void initializeTextViews() {
        tv1 = (TextView) findViewById(R.id.title_tv1);
        tv1.setTypeface(FontFactory.getBFantezy(getBaseContext()));

        tv2 = (TextView) findViewById(R.id.day_tv1);
        tv2.setTypeface(FontFactory.getBFantezy(getBaseContext()));


        tv3 = (TextView) findViewById(R.id.day_tv3);
        tv3.setTypeface(FontFactory.getBFantezy(getBaseContext()));


        mButton = (Button) findViewById(R.id.city_button);
        mButton.setOnClickListener(this);

        tv1.setText(tv1Resources[dayNumber]);
         // due to code, this resource is the same for all days
        tv2.setText(Html.fromHtml(getString(R.string.beginning)));
        tv3.setText(Html.fromHtml(getString(tv3Resources[dayNumber])));
    }

    public void handleClick(View v) {
        // Create an intent to start the new activity.
        Intent intent = new Intent();
        intent.setClass(this, DayGallery.class);
        intent.putExtra("dayname", day);
        startActivity(intent);
    }
}

Hope this helps.

You could put your dialog creation within a separate method and just call that method from your onClick of your buttons. something like the following:

if(day.equalsIgnoreCase("Day1")){
    tv1.setText("First Day");       
    tv2.setText(Html.fromHtml(getString(R.string.beginning)));  
    tv3.setText(Html.fromHtml(getString(R.string.day1))); 

    button = (Button) findViewById(R.id.city_button);        
    button.setOnClickListener(new OnClickListener() { 
        public void onClick(View arg0) { 
            dialogCreation(Html.fromHtml(getString(R.string.torusim_places_1)).toString());
        }

 else if(day.equalsIgnoreCase("Day2")){.... }

Then your dialogCreation() could look like:

public void dialogCreation(String arg0) {
     // custom dialog
    final Dialog dialog = new Dialog(context,R.style.cust_dialog);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);           
    dialog.setContentView(R.layout.custom_dialog); 
    // set the custom dialog components - text, image and button
    TextView text = (TextView) dialog.findViewById(R.id.dialog_text);
    text.setTypeface(FontFactory.getBFantezy(getBaseContext()));                
    text.setText(arg0);

     Button dialogButton = (Button) dialog.findViewById(R.id.dialog_Button);             
            dialogButton.setTypeface(FontFactory.getBFantezy(getBaseContext()));
    // if button is clicked, close the custom dialog
    dialogButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            dialog.dismiss();}
                     });
            dialog.show(); }
                     }); 
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM