0

私は Android 開発とこれらのフォーラムに慣れていないので、お役に立てれば幸いです。私は周りを見回して他の答えを試しましたが、どこにも行きません。

ArrayList からランダムな文字列を返す Java メソッドを作成しました。ボタンが押されたときに設定したいメイン アクティビティ レイアウト XML に 3 つの TextView 要素があります (メソッドを実行して 3 つのランダムな文字列を生成します)。

スマートフォンでアプリを実行するとクラッシュするので、明らかに重大な欠陥があります。

これが私が呼び出しているメソッドです

public void generateExercises() {


    Exercise e1 = new Exercise();
    Exercise e2 = new Exercise();
    Exercise e3 = new Exercise();

    e1.generateExercise();
    e2.generateExercise();
    e3.generateExercise();

    RelativeLayout lView = new RelativeLayout(this);


    myText1 = (TextView)findViewById(R.id.myText1);
    myText1.setText(e1.getName());

    myText2 = (TextView)findViewById(R.id.myText2);
    myText2.setText(e2.getName());

    myText3 = (TextView)findViewById(R.id.myText3);
    myText3.setText(e3.getName());

    lView.addView(myText1);
    lView.addView(myText2);
    lView.addView(myText3);     

    setContentView(lView);
}
//XML File

<TextView
    android:id="@+id/myText2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/exercise2title"
    android:layout_alignBottom="@+id/exercise2title"
    android:layout_alignLeft="@+id/textView1"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/myText3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/exercise3title"
    android:layout_alignBottom="@+id/exercise3title"
    android:layout_alignLeft="@+id/TextView01"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/exercise1title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/title"
    android:layout_marginLeft="39dp"
    android:layout_marginTop="64dp"
    android:text="@string/exercisetitle_one"
    android:textAppearance="?android:attr/textAppearanceMedium" />

ありがとう

編集:「myText1」でXMLのセクションを見逃しました

 <TextView
    android:id="@+id/myText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/exercise1title"
    android:layout_alignBottom="@+id/exercise1title"
    android:layout_alignRight="@+id/title"
    android:layout_marginRight="24dp"
    android:textAppearance="?android:attr/textAppearanceSmall" />

編集:ご協力いただきありがとうございます。コードは現在、期待どおりに機能しています。また、XML の onclick メソッドをカスタムの onClick リスナーに置き換える必要もありました。

4

4 に答える 4

1

TextViewsにTextを追加する前に、Contentviewに設定する必要があると思います。まだ作成されていないテキストをTextViewに追加しようとしています。

テキストを追加する前に、contentViewを設定してみてください。私がそれを正しく知っているなら、あなたは実際にXMLファイルでそれをしたので、あなたはTextViewsをlViewに追加する必要はありません。実際にはXMLでレイアウトを定義したので、コードでレイアウトを再度作成する必要はありません。XMLでレイアウトを作成し、今と同じように入力するだけです。

public void generateExercises() {


Exercise e1 = new Exercise();
Exercise e2 = new Exercise();
Exercise e3 = new Exercise();

e1.generateExercise();
e2.generateExercise();
e3.generateExercise();

setContentView(R.layout.*****); //putyour layoutname here
myText1 = (TextView)findViewById(R.id.myText1);
myText1.setText(e1.getName());

myText2 = (TextView)findViewById(R.id.myText2);
myText2.setText(e2.getName());

myText3 = (TextView)findViewById(R.id.myText3);
myText3.setText(e3.getName());
}

これはあなたがやりたいことをするはずです

于 2013-01-17T23:00:57.937 に答える
0

あなたの myText1 は XML のどこにありますか?

myText1 = (TextView)findViewById(R.id.myText1);
myText1.setText(e1.getName()); //NPE here?
于 2013-01-17T23:11:51.067 に答える
0
public void generateExercises() {
   setContentView(R.layout.xml_file_name);

    Exercise e1 = new Exercise();
    Exercise e2 = new Exercise();
    Exercise e3 = new Exercise();

    e1.generateExercise();
    e2.generateExercise();
    e3.generateExercise();

    myText1 = (TextView)findViewById(R.id.myText1);
    myText1.setText(e1.getName());

    myText2 = (TextView)findViewById(R.id.myText2);
    myText2.setText(e2.getName());

    myText3 = (TextView)findViewById(R.id.myText3);
    myText3.setText(e3.getName());

 }
于 2013-01-17T23:06:11.417 に答える
0

onCreate メソッドから setContentView(lView) を呼び出します。

その後、textViews を取得/設定できます。

myText1 = (TextView)findViewById(R.id.myText1);
myText1.setText(e1.getName());

ビューは既に lView に存在するため (xml で設定したため)、addView を使用する必要はありません。

だから基本的に、

contentView を lView に設定すると、xml レイアウトが取得され、すべてのビューで作成されます。その後、テキストビューを見つけてmyText1 = (TextView)findViewById(R.id.myText1);、テキストを設定しますmyText1.setText(e1.getName());

また、logcat の出力を表示して何が問題なのかを確認し、ブレークポイントを「nullPointerException」に設定して、Eclipse の「デバッグ」機能を試すことも役立ちます。logcat の出力をここに投稿すると、何が問題なのかを 100 倍速く見つけることができます。

于 2013-01-17T23:06:29.873 に答える