2013-10-27 2 views
-1

하단 선형 레이아웃의 테이블 바깥쪽에 이미지 버튼을 추가하려고하면 시작시 내 그림 앱이 충돌합니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?시작시 Android 앱이 다운 됨 - Java.lang.RuntimeException

XML :

<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"> 

    <com.sothree.slidinguppanel.SlidingUpPanelLayout 
     android:id="@+id/sliding_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true"> 

     <LinearLayout 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="#FFCCCCCC" 
      android:orientation="vertical" 
      tools:context=".MainActivity" > 

      <!-- Top Buttons --> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="50dp" 
       android:layout_gravity="center" 
       android:orientation="horizontal" > 

       <ImageButton 
        android:id="@+id/new_btn" 
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent" 
        android:contentDescription="@string/start_new" 
        android:src="@drawable/new_pic" /> 

       <ImageButton 
        android:id="@+id/draw_btn" 
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent" 
        android:contentDescription="@string/brush" 
        android:src="@drawable/brush" /> 

       <ImageButton 
        android:id="@+id/erase_btn" 
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent" 
        android:contentDescription="@string/erase" 
        android:src="@drawable/eraser" /> 

       <ImageButton 
        android:id="@+id/save_btn" 
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent" 
        android:contentDescription="@string/save" 
        android:src="@drawable/save" /> 
      </LinearLayout> 

      <!-- Custom View --> 

      <com.example.drawingfun.DrawingView 
       android:id="@+id/drawing" 
       android:layout_width="fill_parent" 
       android:layout_height="0dp" 
       android:layout_marginBottom="3dp" 
       android:layout_marginLeft="5dp" 
       android:layout_marginRight="5dp" 
       android:layout_marginTop="3dp" 
       android:layout_weight="1" 
       android:background="#FFFFFFFF" 
       android:scaleType="centerInside" /> 



     </LinearLayout> 

     <!-- Color Palette --> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="center" 
      android:orientation="vertical" 
      android:clickable="true"> 

      <!-- Top Row --> 
      <TableLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 
       <TableRow> 
       <LinearLayout 
        android:id="@+id/paint_colors" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal" > 

        <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background = "@drawable/colorbutton1" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton1" 
            android:tag="#FFE21A1A" /> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton2" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton2" 
            android:tag="#FFF2D820" /> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton3" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton3" 
            android:tag="#FF35EF22" /> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton4" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton4" 
            android:tag="#FF26D3EA" /> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton5" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton5" 
            android:tag="#FFF73E9B" /> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton6" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton6" 
            android:tag="#FFFFFFFF" /> 
       </LinearLayout> 
       </TableRow> 
       <!-- Bottom Row --> 
       <TableRow> 
       <LinearLayout 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal" > 

        <ImageButton 
         android:layout_width="@dimen/large_brush" 
         android:layout_height="@dimen/large_brush" 
         android:layout_margin="4dp" 
         android:background="@drawable/colorbutton7" 
         android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton7" 
            android:tag="#FF7A4426"/> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton8" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton8" 
            android:tag="#FFF74F1C"/> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton9" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton9" 
            android:tag="#FF217C14" /> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton10" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton10" 
            android:tag="#FF312EBC"/> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton11" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton11" 
            android:tag="#FF5D1F93" /> 
           <ImageButton 
            android:layout_width="@dimen/large_brush" 
            android:layout_height="@dimen/large_brush" 
            android:layout_margin="4dp" 
            android:background="@drawable/colorbutton12" 
            android:contentDescription="@string/paint" 
            android:onClick="paintClicked" 
            android:src="@drawable/colorbutton12" 
            android:tag="#FF000000"/> 
       </LinearLayout> 
       </TableRow> 
      </TableLayout> 
       <ImageButton 
         android:id="@+id/botDrag" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:layout_marginLeft="8dp" 
         android:gravity="center_horizontal" 
         android:background = "@drawable/sendbutton" 
         android:contentDescription="@string/drag" 
         android:src="@drawable/sendbutton" 
         android:tag="#FFE21A1A" />  

     </LinearLayout> 
    </com.sothree.slidinguppanel.SlidingUpPanelLayout> 

</RelativeLayout> 

자바 :

package com.example.drawingfun; 

import java.util.UUID; 

import android.os.Bundle; 
import android.provider.MediaStore; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TableRow; 
import android.widget.TableLayout; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import android.widget.Toast; 
import com.sothree.slidinguppanel.SlidingUpPanelLayout; 
import com.sothree.slidinguppanel.SlidingUpPanelLayout.PanelSlideListener; 
import android.widget.SeekBar; 
import android.widget.SeekBar.OnSeekBarChangeListener; 

/** 
* This is demo code to accompany the Mobiletuts+ tutorial series: 
* - Android SDK: Create a Drawing App 
* 
* Sue Smith 
* August 2013 
* 
*/ 
public class MainActivity extends Activity implements OnClickListener { 

    //custom drawing view 
    private DrawingView drawView; 
    private View botDrag; 
    //buttons 
    private ImageButton currPaint, drawBtn, eraseBtn, newBtn, saveBtn; 
    //sizes 
    private float mediumBrush; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //get drawing view 
     drawView = (DrawingView)findViewById(R.id.drawing); 
     //get bottom panel drag view 
     botDrag = (View)findViewById(R.id.botDrag); 

     //get the palette and first color button 
     LinearLayout paintLayout = (LinearLayout)findViewById(R.id.paint_colors); 
     currPaint = (ImageButton)paintLayout.getChildAt(0); 
     currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed)); 

     //Send current brush size to color palette 



     //sizes from dimensions 
     mediumBrush = getResources().getInteger(R.integer.medium_size); 

     //draw button 
     drawBtn = (ImageButton)findViewById(R.id.draw_btn); 
     drawBtn.setOnClickListener(this); 

     //set initial size 
     drawView.setBrushSize(mediumBrush); 

     //erase button 
     eraseBtn = (ImageButton)findViewById(R.id.erase_btn); 
     eraseBtn.setOnClickListener(this); 

     //new button 
     newBtn = (ImageButton)findViewById(R.id.new_btn); 
     newBtn.setOnClickListener(this); 

     //save button 
     saveBtn = (ImageButton)findViewById(R.id.save_btn); 
     saveBtn.setOnClickListener(this); 

     SlidingUpPanelLayout layout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout); 
     layout.setShadowDrawable(getResources().getDrawable(R.drawable.above_shadow)); 
     layout.setAnchorPoint(0.3f); 
     layout.setDragView(botDrag); 
     layout.setPanelSlideListener(new PanelSlideListener() { 

      @Override 
      public void onPanelSlide(View panel, float slideOffset) { 
       if (slideOffset < 0.2) { 
        if (getActionBar().isShowing()) { 
         getActionBar().hide(); 
        } 
       } else { 
        if (!getActionBar().isShowing()) { 
         getActionBar().show(); 
        } 
       } 
      } 

      @Override 
      public void onPanelExpanded(View panel) { 


      } 

      @Override 
      public void onPanelCollapsed(View panel) { 


      } 

      @Override 
      public void onPanelAnchored(View panel) { 


      } 
     }); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    //user clicked paint 
    public void paintClicked(View view){ 
     //use chosen color 

     //set erase false 
     drawView.setErase(false); 
     drawView.setBrushSize(drawView.getLastBrushSize()); 

     if(view!=currPaint){ 
      ImageButton imgView = (ImageButton)view; 
      String color = view.getTag().toString(); 
      drawView.setColor(color); 
      //update ui 
      imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed)); 
      currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint)); 
      currPaint=(ImageButton)view; 
     } 
    } 

    @Override 
    public void onClick(View view){ 

     if(view.getId()==R.id.draw_btn){ 
      //draw button clicked 
      final Dialog brushDialog = new Dialog(this); 
      brushDialog.setTitle("Brush size:"); 
      brushDialog.setContentView(R.layout.brush_seekbar); 
      brushDialog.setCancelable(true); 


      SeekBar brushSeekbar = (SeekBar) brushDialog.findViewById(R.id.brushSize_seekbar); 
      int brushSize = brushSeekbar.getProgress(); 
      brushSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

       @Override 
       public void onStopTrackingTouch(SeekBar seekBar) { 


       } 

       @Override 
       public void onStartTrackingTouch(SeekBar seekBar) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onProgressChanged(SeekBar seekBar, int progress, 
         boolean fromUser) { 
        if (fromUser) 
        drawView.setErase(false); //turn off eraser 
        drawView.setBrushSize(progress); //Change StrokeWidth 

       } 

      }); 

      Button closeBrushBtn = (Button) brushDialog.findViewById(R.id.closeBrushBtn); 
      // if decline button is clicked, close the custom dialog 
      closeBrushBtn.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        // Close dialog 
        brushDialog.dismiss(); 
       } 
      }); 
      brushDialog.show(); 
      //pass brush size to DrawingView 

     } 
     else if(view.getId()==R.id.erase_btn){ 
      //switch to erase - choose size 
      final Dialog brushDialog = new Dialog(this); 
      brushDialog.setTitle("Erase size:"); 
      brushDialog.setContentView(R.layout.brush_seekbar); 
      brushDialog.setCancelable(true); 


      SeekBar brushSeekbar = (SeekBar) brushDialog.findViewById(R.id.brushSize_seekbar); 

      brushSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

       @Override 
       public void onStopTrackingTouch(SeekBar seekBar) { 


       } 

       @Override 
       public void onStartTrackingTouch(SeekBar seekBar) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onProgressChanged(SeekBar seekBar, int progress, 
         boolean fromUser) { 
        if (fromUser) 
        drawView.setErase(true); 
        drawView.setBrushSize(progress); //Change StrokeWidth  
       } 
      }); 

      Button closeBrushBtn = (Button) brushDialog.findViewById(R.id.closeBrushBtn); 
      // if decline button is clicked, close the custom dialog 
      closeBrushBtn.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        // Close dialog 
        brushDialog.dismiss(); 
       } 
      }); 
      brushDialog.show(); 
     } 
     else if(view.getId()==R.id.new_btn){ 
      //new button 
      AlertDialog.Builder newDialog = new AlertDialog.Builder(this); 
      newDialog.setTitle("New drawing"); 
      newDialog.setMessage("Start new drawing (you will lose the current drawing)?"); 
      newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){ 
       public void onClick(DialogInterface dialog, int which){ 
        drawView.startNew(); 
        dialog.dismiss(); 
       } 
      }); 
      newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){ 
       public void onClick(DialogInterface dialog, int which){ 
        dialog.cancel(); 
       } 
      }); 
      newDialog.show(); 
     } 
     else if(view.getId()==R.id.save_btn){ 
      //save drawing 
      AlertDialog.Builder saveDialog = new AlertDialog.Builder(this); 
      saveDialog.setTitle("Save drawing"); 
      saveDialog.setMessage("Save drawing to device Gallery?"); 
      saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){ 
       public void onClick(DialogInterface dialog, int which){ 
        //save drawing 
        drawView.setDrawingCacheEnabled(true); 
        //attempt to save 
        String imgSaved = MediaStore.Images.Media.insertImage(
          getContentResolver(), drawView.getDrawingCache(), 
          UUID.randomUUID().toString()+".png", "drawing"); 
        //feedback 
        if(imgSaved!=null){ 
         Toast savedToast = Toast.makeText(getApplicationContext(), 
           "Drawing saved to Gallery!", Toast.LENGTH_SHORT); 
         savedToast.show(); 
        } 
        else{ 
         Toast unsavedToast = Toast.makeText(getApplicationContext(), 
           "Oops! Image could not be saved.", Toast.LENGTH_SHORT); 
         unsavedToast.show(); 
        } 
        drawView.destroyDrawingCache(); 
       } 
      }); 
      saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){ 
       public void onClick(DialogInterface dialog, int which){ 
        dialog.cancel(); 
       } 
      }); 
      saveDialog.show(); 
     } 
    } 



} 

로그 캣 : 어떤 도움

10-26 20:55:10.716: E/AndroidRuntime(883): FATAL EXCEPTION: main 
10-26 20:55:10.716: E/AndroidRuntime(883): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.drawingfun/com.example.drawingfun.MainActivity}: java.lang.ClassCastException: android.widget.TableRow cannot be cast to android.widget.ImageButton 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.os.Looper.loop(Looper.java:137) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-26 20:55:10.716: E/AndroidRuntime(883): at java.lang.reflect.Method.invokeNative(Native Method) 
10-26 20:55:10.716: E/AndroidRuntime(883): at java.lang.reflect.Method.invoke(Method.java:525) 
10-26 20:55:10.716: E/AndroidRuntime(883): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-26 20:55:10.716: E/AndroidRuntime(883): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-26 20:55:10.716: E/AndroidRuntime(883): at dalvik.system.NativeStart.main(Native Method) 
10-26 20:55:10.716: E/AndroidRuntime(883): Caused by: java.lang.ClassCastException: android.widget.TableRow cannot be cast to android.widget.ImageButton 
10-26 20:55:10.716: E/AndroidRuntime(883): at com.example.drawingfun.MainActivity.onCreate(MainActivity.java:53) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.app.Activity.performCreate(Activity.java:5133) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
10-26 20:55:10.716: E/AndroidRuntime(883): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
10-26 20:55:10.716: E/AndroidRuntime(883): ... 11 more 

감사합니다, 나는이 새로운 해요 ndroid 개발과 꽤 여기에서 길을 잃었다.

답변

0

하단 선형 레이아웃이 테이블 레이아웃 내에 있습니다. 또는 이미지 버튼 botDrag를 언급하고 있습니까?

+0

나는 botDrag를 언급했는데, 구체적이지 않은 것에 대해 유감스럽게 생각합니다. 오류가 Eclipse가 ...의 맞춤법을 수정하려고 시도한 주석 행에 의해 발생한 것 같습니다. 매우 이상합니다. 그 주석 줄을 삭제하고 모두 괜찮습니다. 감사! – Gantrof

관련 문제