プログラムでTextViewを作成してaddView()関数を使用してレイアウトに追加しようとしましたが、「指定された子に既に親があります」というランタイム例外が発生しました。最初の親 "です。私はこのテーマについて質問されたすべての質問を見てきましたが、removeView()関数をいつどのように使うべきかを理解できませんでした。removeView()の使用方法は?
だからここに私のコードです:
import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private int maxNumber = 6;
private Integer[] numbers = new Integer[maxNumber];
private Integer[] textSizes = new Integer[maxNumber];
private Integer[] colors = new Integer[8];
private Integer[] randomColors = new Integer[maxNumber];
private Integer[][] margins;
private LayoutParams params[];
private int maxValue = 1000;
private int maxSize = 50;
private int minSize = 15;
private int viewCount = 0;
private int startCount = 3;
private int layoutHeight;
private int layoutWidth;
private int score = 0;
private RelativeLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = (RelativeLayout) findViewById(R.id.layout);
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
layout.setLayoutParams(layoutParams);
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
layoutHeight = displayMetrics.heightPixels;
layoutWidth = displayMetrics.widthPixels;
String[] colorsTxt = getApplicationContext().getResources().getStringArray(R.array.colors);
for (int i = 0; i < colorsTxt.length; i++) {
int newColor = Color.parseColor(colorsTxt[i]);
colors[i] = newColor;
}
createTextView(3);
}
private void createTextView(int num)
{
final TextView tv = new TextView(this);
createProperties(num);
eliminateSameRandoms();
for(int i = viewCount; i < (viewCount + num); i++)
{
tv.setLayoutParams(params[i]);
tv.setText(String.valueOf(numbers[i]));
tv.setTextColor(randomColors[i]);
tv.setTextSize(textSizes[i]);
createListener(tv);
layout.addView(tv);
}
viewCount += num;
}
private void createListener(final TextView textView)
{
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Integer.parseInt(String.valueOf(textView.getText())) == getBiggest()) {
score++;
if(viewCount == startCount * startCount) {
startCount++;
createTextView(startCount);
}
else {
createTextView(startCount);
}
} else {
Intent i = new Intent(MainActivity.this, FailActivity.class);
i.putExtra("score", score);
startActivity(i);
}
}
});
}
private int getBiggest()
{
int max = 0;
for(int i : numbers)
{
if(i > max)
{
max = i;
}
}
return max;
}
private void createProperties(int num)
{
createRandoms(num);
createColors(num);
createTextSizes(num);
createMargins(num);
createParams(num);
}
private void createRandoms(int numRandoms)
{
for(int i = viewCount; i < (viewCount + numRandoms); i++)
{
numbers[i] = new Random().nextInt(maxValue);
}
}
private void createParams(int numParams)
{
params = new LayoutParams[numParams];
for(int i = viewCount; i < (viewCount + numParams); i++)
{
params[i] = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params[i].leftMargin = margins[i][0];
params[i].topMargin = margins[i][1];
}
}
private void createMargins(int numMargins)
{
margins = new Integer[numMargins][2];
for(int i = viewCount; i < (viewCount + numMargins); i++)
{
margins[i][0] = new Random().nextInt(layoutWidth - 40) + 20;
margins[i][1] = new Random().nextInt(layoutHeight - 40) + 20;
}
}
private void createTextSizes(int numTextSizes)
{
for(int i = viewCount; i < (viewCount + numTextSizes); i++)
{
textSizes[i] = new Random().nextInt(maxSize - minSize) + minSize;
}
}
private void createColors(int numColors)
{
for(int i = viewCount; i < (viewCount + numColors); i++)
{
randomColors[i] = colors[new Random().nextInt(colors.length - 1)];
}
}
private boolean inRange(int position, int other)
{
int range = 60;
return !(position - other < range && other - position < range);
}
private void eliminateSameRandoms()
{
int numRandoms = viewCount;
int i = 0;
while(i < numRandoms)
{
for(int j = 0; j < numRandoms; j++)
{
Log.d("i: " , String.valueOf(i));
Log.d("j: " , String.valueOf(j));
if(j != (numRandoms - i))
{
while (numbers[j].equals(numbers[numRandoms - (i + 1)]))
{
numbers[j] = new Random().nextInt(maxValue);
}
while (randomColors[j].equals(randomColors[numRandoms - (i + 1)]))
{
randomColors[j] = colors[new Random().nextInt(colors.length)];
}
while (textSizes[j].equals(textSizes[numRandoms - (i + 1)]))
{
textSizes[j] = new Random().nextInt(maxSize - minSize) + minSize;
}
while(inRange(margins[j][0], margins[numRandoms - (i + 1)][0]))
{
margins[j][0] = new Random().nextInt(layoutWidth - 40) + 20;
}
while(inRange(margins[j][1], margins[numRandoms - (i + 1)][1]))
{
margins[j][1] = new Random().nextInt(layoutHeight - 40) + 20;
}
}
}
i++;
}
}
}
のみRelativeLayoutは、私が
前((ViewGroup)tv.getParent()).removeView(tv);
を使用しようとしたのid =レイアウト
を持っている私のXMLレイアウトにあり
layout.addView(tv);
は私のコードのさまざまな位置にありますが、どれも働いていませんでした。
私はthisとthisのように見えましたが、解決策を見つけられませんでした。
removeView()はどこでどのように使うべきですか?