【问题标题】:Custom View, Rendering Problems in Android StudioAndroid Studio 中的自定义视图、渲染问题
【发布时间】:2017-07-06 23:51:00
【问题描述】:

我在使用 Android Studio 时看到了锻炼。目的;金字塔就是创建一条从上到下编号不同的路径。

我编写了代码,但是这个应用程序不工作。我看到了这个错误信息:

自定义视图 Ekran 不使用 2 或 3 参数视图构造函数; 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;
    }
}

Bulmaca.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;
}

}

【问题讨论】:

  • 自定义视图需要所有四个构造函数,否则您将无法在 XML 和程序中使用。添加所有构造函数

标签: android view rendering render


【解决方案1】:

如果你阅读了你的错误

自定义视图 Ekran 没有使用 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);
}

添加以下构造函数就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多