Как мне получить текст редактирования, который будет отображаться под моим изображением, каждый раз, когда я делаю снимок?
Я делаю приложение типа блокнота, в котором пользователь может делать снимки и размещать их между текстом, когда он его печатает.
В моем приложении у меня есть button
, editText
а также imageView
, Когда он начинается, есть только button
и editText
, Пользователь вводит в editText
и когда он нажимает button
камера открывается. Сделанный снимок помещается прямо под editText
(под последней строкой, введенной пользователем). Под картинкой новый editText
появляется и пользователь может ввести текст в это. Когда он снова нажимает кнопку, делается еще один снимок, помещенный ниже второго editText
и третий editText
Доступно пользователю для ввода текста.
Таким образом, каждый раз, когда пользователь делает снимок, нажав на кнопку, новый editText
появляется под изображением. Это продолжает цикл, позволяя пользователю вводить как текст, так и изображения, столько изображений и абзацев, сколько он хочет.
Но этого не происходит. Я могу ввести текст только один раз и сделать 1 фотографию. Нет второго editText
когда-либо появляется. Что здесь происходит не так?
Код для чередования editText
а также imageView
находится в onActivityResult()
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>
ОБНОВЛЕНИЕ - Принимая предложения Петрумо, я пересмотрел код. Хотя все еще не работает так, как должно. После получения первого изображения, второго editText
не отображается под изображением. Я убедился, что id
с для 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
с Петрумо.. и это работает. editText
s появляются один под другим. Но когда я вставляю 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)
1 ответ
Есть несколько проблем с используемым кодом:
- использование того же идентификатора textVar.setId(+2);
это должно быть что-то
textVar.setId (ID ++);
где id является глобальной переменной
- то же самое должно быть применено к идентификатору изображения, оно должно быть уникальным и использоваться следующим, если вы хотите разместить его ниже
Я упростил ваше решение и заставил его работать, вы можете использовать его в качестве основы и добавить свое изображение между:
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);
}
textVar=new EditText(MainActivity.this);
textVar.setId(id++);
textVar.setText("NEW");
relativeLayout.addView(textVar, relativeParams);
Более простой способ, если вы хотите добавить их только ниже, - это использовать LinearLayout с вертикальной ориентацией или более элегантное решение, чтобы изменить его на список с адаптером, как предлагается в комментарии.