2010-12-22 29 views
0

Ich bin ein Pop-up-Fenster in Klick-Ereignisse zu schaffen, innerhalb dieses Fensters Pop-up gibt es Textansicht und Button ...Android Textansicht

Wenn ich eine Id in XML und stellen Sie den Text von

erstellen
TextView txt=(TextView)findViewById(R.id.text) 
txt.setText("Message"); 

Ich bekomme einen Nullzeiger Ausnahme. Das gleiche geschieht für einen Button ..

Hier ist mein Code

package com.examples; 

import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.util.List; 
import java.util.Locale; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.text.format.DateFormat; 
import android.util.Log; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.PopupWindow; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 

public class Main extends Activity implements OnClickListener 
    { 
    private final String[] months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; 
     private static final String tag = "Main"; 
     private Button selectedDayMonthYearButton; 
     private Button currentMonth; 
     private ImageView prevMonth; 
     private ImageView nextMonth; 
     private GridView calendarView; 
     private GridCellAdapter adapter; 
     private Calendar _calendar; 
     private int month, year; 
     private final DateFormat dateFormatter = new DateFormat(); 
     private static final String dateTemplate = "MMMM yyyy"; 
     private PopupWindow pw; 
     TextView txt1; 
     static ViewHolder holder; 
     private void getRequestParameters() 
      { 
       Intent intent = getIntent(); 
       if (intent != null) 
        { 
         Bundle extras = intent.getExtras(); 
         if (extras != null) 
          { 
           if (extras != null) 
            { 
             Log.d(tag, "+++++----------------->" + extras.getString("params")); 
            } 
          } 
        } 
      } 


     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
      { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.simple_calendar_view); 

       _calendar = Calendar.getInstance(Locale.getDefault()); 
       month = _calendar.get(Calendar.MONTH); 
       Log.v("Months", ""+month); 
       year = _calendar.get(Calendar.YEAR); 
       Log.v("YEAR", ""+year); 

       selectedDayMonthYearButton = (Button) this.findViewById(R.id.selectedDayMonthYear); 
       selectedDayMonthYearButton.setText("Selected: "); 

       prevMonth = (ImageView) this.findViewById(R.id.prevMonth); 
       prevMonth.setOnClickListener(this); 

       currentMonth = (Button) this.findViewById(R.id.currentMonth); 
       currentMonth.setText(dateFormatter.format(dateTemplate, _calendar.getTime())); 

       nextMonth = (ImageView) this.findViewById(R.id.nextMonth); 
       nextMonth.setOnClickListener(this); 

       calendarView = (GridView) this.findViewById(R.id.calendar); 

       // Initialised 
       adapter = new GridCellAdapter(getApplicationContext(), R.id.day_gridcell, month, year); 
       adapter.notifyDataSetChanged(); 
       calendarView.setAdapter(adapter); 
     } 



     @Override 
     public void onClick(View v) 
      { 
       if (v == prevMonth) 
        { 
         if (month <= 1) 
          { 
           month = 11; 
           year--; 
          } else 
          { 
           month--; 
          } 

         adapter = new GridCellAdapter(getApplicationContext(), R.id.day_gridcell, month, year); 
         _calendar.set(year, month, _calendar.get(Calendar.DAY_OF_MONTH)); 
         currentMonth.setText(months[_calendar.get(Calendar.MONTH)] + "-" +_calendar.get(Calendar.YEAR)); 
         //currentMonth.setText(_calendar.getTime().toString()); 

         adapter.notifyDataSetChanged(); 
         calendarView.setAdapter(adapter); 
        } 
       if (v == nextMonth) 
        { 
         if (month >= 11) 
          { 
           month = 0; 
           year++; 
          } else 
          { 
           month++; 
          } 

         adapter = new GridCellAdapter(getApplicationContext(), R.id.day_gridcell, month, year); 
         _calendar.set(year, month, _calendar.get(Calendar.DAY_OF_MONTH)); 
         currentMonth.setText(months[_calendar.get(Calendar.MONTH)] + "-" +_calendar.get(Calendar.YEAR)); 
         //currentMonth.setText(_calendar.getTime().toString()); 
         adapter.notifyDataSetChanged(); 
         calendarView.setAdapter(adapter); 
        } 
      } 

     // Inner Class 
     public class GridCellAdapter extends BaseAdapter implements OnClickListener 
      { 
       private static final String tag = "GridCellAdapter"; 
       private final Context _context; 
       private final List<String> list; 
       private final String[] weekdays = new String[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; 

       private final int[] daysOfMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 
       private final int month, year; 
       int daysInMonth, prevMonthDays; 
       private final int currentDayOfMonth; 
       private Button gridcell; 

       // Days in Current Month 
       public GridCellAdapter(Context context, int textViewResourceId, int month, int year) 
        { 
         super(); 
         this._context = context; 
         this.list = new ArrayList<String>(); 
         this.month = month; 
         this.year = year; 

         Log.d(tag, "Month: " + month + " " + "Year: " + year); 
         Calendar calendar = Calendar.getInstance(); 
         currentDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); 

         printMonth(month, year); 
        } 

       public String getItem(int position) 
        { 
         return list.get(position); 
        } 

       @Override 
       public int getCount() 
        { 
         return list.size(); 
        } 

       private void printMonth(int mm, int yy) 
        { 
         // The number of days to leave blank at 
         // the start of this month. 
         int trailingSpaces = 0; 
         int leadSpaces = 0; 
         int daysInPrevMonth = 0; 
         int prevMonth = 0; 
         int prevYear = 0; 
         int nextMonth = 0; 
         int nextYear = 0; 

         GregorianCalendar cal = new GregorianCalendar(yy, mm, currentDayOfMonth); 

         // Days in Current Month 
         daysInMonth = daysOfMonth[mm]; 
         int currentMonth = mm; 
         if (currentMonth == 11) 
          { 
           prevMonth = 10; 
           daysInPrevMonth = daysOfMonth[prevMonth]; 
           nextMonth = 0; 
           prevYear = yy; 
           nextYear = yy + 1; 
          } else if (currentMonth == 0) 
          { 
           prevMonth = 11; 
           prevYear = yy - 1; 
           nextYear = yy; 
           daysInPrevMonth = daysOfMonth[prevMonth]; 
           nextMonth = 1; 
          } else 
          { 
           prevMonth = currentMonth - 1; 
           nextMonth = currentMonth + 1; 
           nextYear = yy; 
           prevYear = yy; 
           daysInPrevMonth = daysOfMonth[prevMonth]; 
          } 

         // Compute how much to leave before before the first day of the 
         // month. 
         // getDay() returns 0 for Sunday. 
         trailingSpaces = cal.get(Calendar.DAY_OF_WEEK) - 1; 

         if (cal.isLeapYear(cal.get(Calendar.YEAR)) && mm == 1) 
          { 
           ++daysInMonth; 
          } 

         // Trailing Month days 
         for (int i = 0; i < trailingSpaces; i++) 
          { 
           list.add(String.valueOf((daysInPrevMonth - trailingSpaces + 1) + i) + "-GREY" + "-" + months[prevMonth] + "-" + prevYear); 
          } 

         // Current Month Days 
         for (int i = 1; i <= daysInMonth; i++) 
          { 
           list.add(String.valueOf(i) + "-WHITE" + "-" + months[mm] + "-" + yy); 
          } 

         // Leading Month days 
         for (int i = 0; i < list.size() % 7; i++) 
          { 
           Log.d(tag, "NEXT MONTH:= " + months[nextMonth]); 
           list.add(String.valueOf(i + 1) + "-GREY" + "-" + months[nextMonth] + "-" + nextYear); 
          } 
        } 

       @Override 
       public long getItemId(int position) 
        { 
         return position; 
        } 

       @Override 
       public View getView(int position, View convertView, ViewGroup parent) 
        { 
         Log.d(tag, "getView ..."); 
         View row = convertView; 
         if (row == null) 
          { 
           // ROW INFLATION 
           Log.d(tag, "Starting XML Row Inflation ... "); 
           LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
           row = inflater.inflate(R.layout.day_gridcell, parent, false); 

           Log.d(tag, "Successfully completed XML Row Inflation!"); 
          } 

         // Get a reference to the Day gridcell 
         gridcell = (Button) row.findViewById(R.id.day_gridcell); 
         gridcell.setOnClickListener(this); 

         // ACCOUNT FOR SPACING 

         Log.d(tag, "Current Day: " + currentDayOfMonth); 
         String[] day_color = list.get(position).split("-"); 
         gridcell.setText(day_color[0]); 
         gridcell.setTag(day_color[0] + "-" + day_color[2] + "-" + day_color[3]); 

         if (day_color[1].equals("GREY")) 
          { 
           gridcell.setTextColor(Color.LTGRAY); 
          } 
         if (day_color[1].equals("WHITE")) 
          { 
           gridcell.setTextColor(Color.WHITE); 
          } 
         if (position == currentDayOfMonth) 
          { 
           gridcell.setTextColor(Color.BLUE); 
          } 

         return row; 
        } 





       @Override 
       public void onClick(View view) 
        { 

        LayoutInflater inflater = (LayoutInflater) Main.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        // inflate our view from the corresponding XML file 
        final View layout = inflater.inflate(R.layout.popup, (ViewGroup)findViewById(R.id.popup_menu_root)); 

        String date_month_year = (String) view.getTag(); 

        pw = new PopupWindow(layout, 200,75, true); 
        holder = new ViewHolder(); 
         holder.text1 = (TextView) view.findViewById(R.id.pop_txt); 
         //holder.text1.setText("HIIIIIII"); 

        pw.dismiss(); 
        pw.showAtLocation(layout, Gravity.CENTER_VERTICAL, 10, 30); 


         Toast.makeText(getApplicationContext(), date_month_year, Toast.LENGTH_SHORT).show(); 
         selectedDayMonthYearButton.setText("Selected: " + date_month_year); 
         Log.v("Button ID",""+R.id.bttn2); 

         //layout.setVisibility(View.INVISIBLE); 

//      findViewById(R.id.bttn2).setOnClickListener(
//        new OnClickListener() { 
////          
////         //LayoutInflater inflater = (LayoutInflater) Main.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
////          // inflate our view from the corresponding XML file 
////         // final View layout = inflater.inflate(R.layout.popup, (ViewGroup)findViewById(R.id.popup_menu_root)); 
////          
//// 
////         @Override 
//         public void onClick(View arg0) { 
////          // TODO Auto-generated method stub 
//////          pw = new PopupWindow(layout, 200,75, true); 
//////            
//////          pw.dismiss(); 
//////          pw.showAtLocation(layout, Gravity.CENTER_VERTICAL, 10, 30); 
////           
//         } 
//        }); 
        } 
      } 



     static class ViewHolder { 
      TextView text1; 

     } 
     //list.setOnItemClickListener(new OnItemClickListener(){ 

    } 

Antwort

2

Sie rufen findViewById() auf den View die geklickt wurde, nicht die Pop-up-Fenster. diese

Wechsel:

holder.text1 = (TextView) view.findViewById(R.id.pop_txt); 

An:

holder.text1 = (TextView) pw.findViewById(R.id.pop_txt); 
1

PopupWindow ist kein Blick in Android. Tatsächlich erstreckt sich PopupView direkt Object - das bedeutet, ein paar Dinge:

  1. findViewById() kann nicht von einem PopupWindow genannt werden, weil PopupWindow keine findViewById() Methode hat.

  2. Wenn findViewById() versucht, die UI-Struktur zu durchlaufen, kann es die Elemente darin nicht finden, da das PopupWindow eigentlich keine Ansicht in der Hierarchie ist.

  3. (ich denke) das bedeutet PopupWindow kann nicht für dynamische Inhalte verwendet werden. Sie müssen stattdessen eine Dialog verwenden, die tatsächlich eine findViewById() Methode zur Verfügung hat. (Dialog ist auch keine Ansicht, aber es ist findViewById() definiert.)

Verwandte Themen