2017-02-17 50 views
-1

我在使用Android Studio時看到了練習。目標;金字塔是從上到下創建一個具有不同數字的路徑。自定義視圖,Android Studio中的渲染問題

我寫了代碼,但是,這個應用程序不工作。我看到這個錯誤信息:

自定義視圖Ekran沒有使用2或3參數的View構造函數; XML屬性不起作用。

activity_main.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="com.example.as.deneme2.MainActivity"> 
    <com.example.as.deneme2.Ekran 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/ekran" /> 
</RelativeLayout> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 
Ekran ekran; 
Bulmaca[] bulmacalar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Random random = new Random(); 
    String[] bulmacaBilgileri = {"443252145336141522663", "234524435626143614625", 
      "161524246313452326215", "355424315665631243245", "653634542631351325265", 
      "543236612135654465432", "4453852793142686831417252765951383798349412830", 
      "345342468929768161215485464767167583529398619", 
      "2331549812654744213599187938583561657374389710", 
      "13492554832619237564412375353491475182356918"}; 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
    bulmacalar = new Bulmaca[bulmacaBilgileri.length]; 
    for (int i = 0; i < bulmacaBilgileri.length; i++) { 
     bulmacalar[i] = new Bulmaca(bulmacaBilgileri[i]); 
    } 
    ekran = (Ekran) findViewById((R.id.ekran)); 
    ekran.bulmaca = bulmacalar[random.nextInt(bulmacaBilgileri.length)]; 
    ekran.hucreGenislik = displayMetrics.widthPixels/(ekran.bulmaca.getBuyukluk() + 2); 
} 

}

Ekran.java

public class Ekran extends View { 

int hucreGenislik; 
Bulmaca bulmaca; 

public Ekran(Context context) { 
    super(context); 
} 

public void onDraw(Canvas canvas){ 
    int x1,y1,x2,y2; 
    Paint siyah = new Paint(), mavi = new Paint(), yazi= new Paint(); 
    siyah.setColor(Color.BLACK); 
    siyah.setStyle(Paint.Style.STROKE); 
    siyah.setStrokeWidth(1); 
    mavi.setColor(Color.BLUE); 
    mavi.setStyle(Paint.Style.STROKE); 
    mavi.setStrokeWidth(3); 
    if(bulmaca!=null){ 
     for(int i=0;i<bulmaca.getBuyukluk();i++){ 
      for (int j=0;j<=i;j++){ 
       x1=(int)((bulmaca.getBuyukluk()-i+1+2*j)/2.0)*hucreGenislik; 
       y1=(i+1)*hucreGenislik; 
       x2=x1+hucreGenislik; 
       y2=y1+hucreGenislik; 
       Rect alan= new Rect(x1,y1,x2,y2); 
       if(bulmaca.oynananDeger(i)!=j) { 
        canvas.drawRect(alan, siyah); 
       }else { 
        canvas.drawRect(alan, mavi); 
       } 
       String sayi=""+bulmaca.sayi(i,j); 
       int fontBuyukluk =(int) (hucreGenislik/1.5); 
       yazi.setTextSize(fontBuyukluk); 
       Rect yaziBuyukluk= new Rect(); 
       yazi.getTextBounds(sayi,0,1,yaziBuyukluk); 
       canvas.drawText(sayi,alan.left+(hucreGenislik-yaziBuyukluk.width())/2, 
         (float)(alan.top+hucreGenislik-yaziBuyukluk.height()/2),yazi); 
       } 
      } 
     } 
    } 
    public boolean onTouchEvent(MotionEvent event){ 
     int x1,y1,x2,y2; 
     int x=(int) event.getX(); 
     int y=(int) event.getY(); 
     for (int i=0; i<bulmaca.getBuyukluk();i++){ 
      for(int j=0;j<=i;j++){ 
       x1=(int)((bulmaca.getBuyukluk()-i+1+2*j)/2.0)*hucreGenislik; 
       y1=(i+1)*hucreGenislik; 
       x2=x1+hucreGenislik; 
       y2=y1+hucreGenislik; 
       Rect alan=new Rect(x1,y1,x2,y2); 
       if(alan.contains(x,y)){ 
        bulmaca.oyna(i,j); 
        invalidate(); 
        return true; 
       } 
      } 
     } 
     return true; 
    } 
} 

Bulm aca.java

public class Bulmaca { 
int buyukluk; 
int[][] sayilar; 
int[] oynama; 
public Bulmaca(String bulmacaBilgisi){ 
    int k=0; 
    buyukluk=(int) Math.sqrt(2*bulmacaBilgisi.length()); 
    oynama= new int[buyukluk]; 
    sayilar = new int[buyukluk][]; 
    for(int i=0;i<buyukluk;i++){ 
     oynama[i]=-1; 
     sayilar[i]=new int[i+1]; 
     for(int j=0; j<=i;j++){ 
      sayilar[i][j]=bulmacaBilgisi.charAt(k)-48; 
      k++; 
     } 
    } 
} 
public int sayi(int satir,int sutun){ 
    return sayilar[satir][sutun]; 
} 
public int oynananDeger(int satir){ 
    return oynama[satir]; 
} 
public void oyna(int satir,int deger){ 
    oynama[satir]=deger; 
} 
public int getBuyukluk(){ 
    return buyukluk; 
} 

}

+0

自定義視圖需要所有四個構造函數,否則您將無法在XML中使用以及程序.add all constructor –

回答

0

如果你通過你的錯誤

自定義視圖熒光屏未使用2或3個參數的構造函數查看閱讀; XML屬性不起作用。

您在Ekran.java中缺少構造函數。

public CustomProgressBar(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
} 

public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) 
{ 
    super(context, attrs, defStyleAttr); 
} 

添加下面的構造函數,你應該罰款。