0

私は、ユーザーがテキストを入力しながら写真を撮り、テキストの間に配置できるメモ帳タイプのアプリを作成しています。

私のアプリには、buttoneditTextがありimageViewます。起動すると と しかありませbuttoneditText。ユーザーが に入力し、editTextを押すとbutton、カメラが開きます。撮影した写真は、editText(ユーザーが入力した最後の行の下) のすぐ下に配置されます。画像の下に neweditTextが表示され、ユーザーはこれにテキストを入力できます。ボタンをもう一度押すと、別の写真が撮影され、2 番目の写真の下に配置されeditText、3 番目の写真editTextはユーザーがテキストを入力できるようになります。

そのため、ユーザーがボタンを押して写真を撮るたびにeditText、画像の下に新しい画像が表示されます。これはループし続け、ユーザーはテキストと画像の両方を、必要な数の画像と段落を入力できます。

しかし、これは起こっていません。テキストを 1 回入力して写真を 1 枚しか撮れません。秒editTextは表示されません。ここで何がうまくいかないのですか。

交互のコードは、次の場所にあります editTextimageViewonActivityResult()

mainActivity.java

package com.example.nirvan.cameraexample3;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.media.Image;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity
{


ImageView myImage;
EditText textVar;
int flag=0;             //flag==0 means place img below text, ==1 means below textVar

private String pictureImagePath = "";
Uri outputFileUri;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button imgButton=(Button) findViewById(R.id.imgButton);


    View.OnClickListener imgButtonClickListener=new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String imageFileName = timeStamp + ".jpg";
            File storageDir = Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES);
            pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName;
            File file = new File(pictureImagePath);
            outputFileUri = Uri.fromFile(file);
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            startActivityForResult(cameraIntent, 1);
        }
    };
    imgButton.setOnClickListener(imgButtonClickListener);


}



protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    Log.d("TAG","CUSTOOOM");
    RelativeLayout relativeLayout=(RelativeLayout) findViewById(R.id.relativeLayout);
    myImage=new ImageView(this);
    myImage.setId(+1);




    if (requestCode == 1 && resultCode == RESULT_OK)
    {
        File imgFile = new File(pictureImagePath);
       if (imgFile.exists())
        {
            Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
           // myImage = (ImageView) findViewById(R.id.imageViewTest);

            //this code ensures the imageView is placed below the editText
            RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams
                    (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);

            if(flag==0)
               {
                   relativeParams.addRule(RelativeLayout.BELOW, R.id.text);
                   flag=1;
               }
            else if(flag==1)
                relativeParams.addRule(RelativeLayout.BELOW, textVar.getId());

            //myImage.setLayoutParams(relativeParams);
            relativeLayout.addView(myImage,relativeParams);
            //
            myImage.setImageBitmap(myBitmap);


            //place the new editText below the imgaeView just placed
            relativeParams = new RelativeLayout.LayoutParams
                    (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
            relativeParams.addRule(RelativeLayout.BELOW, myImage.getId());
            textVar=new EditText(this);
            textVar.setId(+2    );
            relativeLayout.addView(textVar,relativeParams);
            textVar.setText("NEW");

        }
    }//






}



}

mainActivity.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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:id="@+id/relativeLayout"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.nirvan.cameraexample3.MainActivity">





<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="IMG"
    android:id="@+id/imgButton"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/text"
    android:layout_below="@id/imgButton"
    />

</RelativeLayout>

更新 - Petrumoの提案を受けて、コードを修正しました。それはまだ正常に機能していませんが。最初の画像を撮影した後editText、画像の下に 2 番目の画像が表示されません。idと のsがメソッドの反復ごとに異なるtextViewことを確認しました。imageView

onActivityResult() が更新されました

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    Log.d("TAG","CUSTOOOM");
    RelativeLayout relativeLayout=(RelativeLayout) findViewById(R.id.relativeLayout);
    myImage=new ImageView(this);
    myImage.setId(id1++);
    textVar.setId(id2++);




    if (requestCode == 1 && resultCode == RESULT_OK)
    {
        File imgFile = new File(pictureImagePath);
       if (imgFile.exists())
        {
            Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
           // myImage = (ImageView) findViewById(R.id.imageViewTest);

            //this code ensures the imageView is placed below the editText
            RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams
                    (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);

            if(flag==0)
               {
                   relativeParams.addRule(RelativeLayout.BELOW, R.id.text);
                   flag=1;
               }
            else if(flag==1)
                relativeParams.addRule(RelativeLayout.BELOW, textVar.getId());




            //myImage.setLayoutParams(relativeParams);
            relativeLayout.addView(myImage,relativeParams);
            //
            myImage.setImageBitmap(myBitmap);


            //place the new editText below the imgaeView just placed
            relativeParams = new RelativeLayout.LayoutParams
                    (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
            relativeParams.addRule(RelativeLayout.BELOW, myImage.getId());
            textVar=new EditText(this);
            //textVar.setId(id2++);

            relativeLayout.addView(textVar,relativeParams);
            textVar.setText("NEW");

        }
    }//






}

更新 2:だから私は単純に自分のコードonActivityResultを Petrumo のものに置き換えただけで、うまくいきました。が上下に表示されeditTextます。しかし、imageViewコードを挿入すると、写真を撮った直後にアプリがクラッシュします。

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    RelativeLayout relativeLayout=(RelativeLayout) findViewById(R.id.relativeLayout);
    RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams
            (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    if(textVar != null)
    {
        relativeParams.addRule(RelativeLayout.BELOW, textVar.getId());
    }
    else
    {
        relativeParams.addRule(RelativeLayout.BELOW, R.id.text);
    }

    myImage=new ImageView(this);
    myImage.setId(id1++);
    //set image

        File imgFile = new File(pictureImagePath);
        if (imgFile.exists() && requestCode == 1 && resultCode == RESULT_OK)
        {
            Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
            relativeLayout.addView(myImage, relativeParams);
            myImage.setImageBitmap(myBitmap);


        }

    //



    textVar=new EditText(MainActivity.this);
    textVar.setId(id2++);
    relativeParams.addRule(RelativeLayout.BELOW, myImage.getId());
    relativeLayout.addView(textVar, relativeParams);
    textVar.setText("NEW");
    relativeLayout.addView(textVar, relativeParams);




}

ログ

 FATAL EXCEPTION: main
                                                                               Process: com.example.nirvan.cameraexample3, PID: 27598
                                                                               java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.nirvan.cameraexample3/com.example.nirvan.cameraexample3.MainActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
                                                                                   at android.app.ActivityThread.deliverResults(ActivityThread.java:3432)
                                                                                   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3475)
                                                                                   at android.app.ActivityThread.access$1300(ActivityThread.java:139)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                   at android.os.Looper.loop(Looper.java:136)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5086)
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
                                                                                   at dalvik.system.NativeStart.main(Native Method)
                                                                                Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
                                                                                   at android.view.ViewGroup.addViewInner(ViewGroup.java:3564)
                                                                                   at android.view.ViewGroup.addView(ViewGroup.java:3417)
                                                                                   at android.view.ViewGroup.addView(ViewGroup.java:3393)
                                                                                   at com.example.nirvan.cameraexample3.MainActivity.onActivityResult(MainActivity.java:105)
                                                                                   at android.app.Activity.dispatchActivityResult(Activity.java:5446)
                                                                                   at android.app.ActivityThread.deliverResults(ActivityThread.java:3428)
                                                                                   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3475) 
                                                                                   at android.app.ActivityThread.access$1300(ActivityThread.java:139) 
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                   at android.os.Looper.loop(Looper.java:136) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5086) 
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                       at java.lang.reflect.Method.invoke(Method.java:515)
4

1 に答える 1