Переход на новую страницу при выборе изображения

В настоящее время я создаю приложение с функцией камеры, которая позволяет пользователям выбирать свое изображение или делать захват. stackoverflow.com/a/22165449/5261462. Но я хочу, чтобы выбранное изображение отображалось на другой странице вместо того, чтобы просто отображаться в imageView. Изображение должно исправить экран и может быть дополнено подписью ниже, например whatsapp.

Это то, что я пробовал до сих пор.

Все начинается с Project1.java с расширением imagebutton.

 public void addListenerOnButton() {

        imageButton = (ImageButton) findViewById(R.id.imageButton);

        imageButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                ImageFitScreen i = new ImageFitScreen();
                i.selectImage();
            }

        });

    }

ImageFitScreen.java

     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.image_fit_screen);

            b = (ImageView) findViewById(R.id.imageView3);
            t = (EditText) findViewById(R.id.editText38);
            u = (EditText) findViewById(R.id.editText39);
        }

        public void selectImage() {

            final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" };
            AlertDialog.Builder builder = new AlertDialog.Builder(ImageFitScreen.this);
            builder.setTitle("Add Photo!");
            builder.setItems(options, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int item) {
                    if (options[item].equals("Take Photo"))
                    {
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                       File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
                       intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                       startActivityForResult(intent, 1);
   }
                     else if (options[item].equals("Choose from Gallery"))
                      {
                        Intent intent = new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                       startActivityForResult(intent, 2);
                       }
                       else if (options[item].equals("Cancel")) {
                       dialog.dismiss();
                       }
                       }
                         });

            builder.show();

        }

image_fit_screen

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="574dp"
        android:layout_height="523dp"
        android:id="@+id/imageView3"
        android:layout_x="6dp"
        android:layout_y="0dp" />

    <EditText
        android:layout_width="388dp"
        android:layout_height="wrap_content"
        android:id="@+id/editText38"
        android:layout_x="8dp"
        android:layout_y="435dp" />

    <EditText
        android:layout_width="386dp"
        android:layout_height="wrap_content"
        android:id="@+id/editText39"
        android:hint="Add a caption"
        android:layout_x="2dp"
        android:layout_y="410dp" />

</AbsoluteLayout>

Но я получаю сообщение об ошибке, как показано ниже, когда нажимается imageButton в Project1.java.

11-03 11:44:44.800 31219-31219/com.example.project.project E/AndroidRuntime﹕ НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.project.project, PID: 31219 java.lang.NullPointerException в android.content. ContextWrapper.getApplicationInfo(ContextWrapper.java:164) в android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:103) в android.support.v7.app.AlertDialog.resolveDialogTheme(AlertDialog.java:108) в android.support.v7 .app.AlertDialog$Builder.(AlertDialog.java:269) в com.example.project.project.ImageFitScreen.selectImage(ImageFitScreen.java:77) в com.example.project.project.Project1$2.onClick(Project1.java :80) в android.view.View.performClick(View.java:4654) в android.view.View$PerformClick.run(View.java:19438) в android.os.Handler.handleCallback(Handler.java:733) в android.os.Handler.dispatchMessage(Handler.java:95) на android.os.Looper.loop(Looper.java:146)

(ImageFitScreen.java:77)

Построитель AlertDialog.Builder = новый AlertDialog.Builder(ImageFitScreen.this);

(Проект1.java:80)

я.выбратьИзображение();

Я серьезно остро нуждаюсь в некотором совете. Может кто-нибудь, пожалуйста, помогите мне советом. ПОЖАЛУЙСТА : )?


person Hoo    schedule 03.11.2015    source источник
comment
Проверить   -  person Skynet    schedule 03.11.2015
comment
ImageFitScreen - это активность?   -  person Fabin Paul    schedule 03.11.2015
comment
@FabinPaul Я.. моя идея - перенести весь код из selectimage в новый класс и использовать новый макет.   -  person Hoo    schedule 03.11.2015


Ответы (1)


Насколько я понял, ImageFitScreen - это действие, и его следует запускать с использованием Intent, т.е.

Intent i = new Intent(Project1.this,ImageFitScreen.class);
startActivity(i);

Если вы посмотрите на исключение, оно скажет вам, что контекст равен нулю, т.е. ImageFitScreen.this имеет значение NULL в строке

AlertDialog.Builder builder = new AlertDialog.Builder(ImageFitScreen.this);

Это связано с тем, что активность будет иметь контекст только в том случае, если она запущена менеджером активности. Мы используем намерение, чтобы попросить менеджера активности начать действие. Надеюсь, это поможет вам.

ОБНОВЛЕНИЕ:

Вы можете использовать ImageFitScreen для просмотра изображения и редактирования текста для подписи. Затем запустите ImageFitScreen, когда вам нужно, чтобы пользователь выбрал изображение. И при создании ImageFitScreen вы можете запустить функцию selectImage(), т.е.

Проект1.java

public void addListenerOnButton() {

    imageButton = (ImageButton) findViewById(R.id.imageButton);

    imageButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            Intent i = new Intent(Project1.this,ImageFitScreen.class);
            startActivity(i);
        }

    });

}

ImageFitScreen.java

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.image_fit_screen);

        b = (ImageView) findViewById(R.id.imageView3);
        t = (EditText) findViewById(R.id.editText38);
        u = (EditText) findViewById(R.id.editText39);

        selectImage();
    }

    public void selectImage() {

        final CharSequence[] options = { "Take Photo", "Choose from             Gallery","Cancel" };
        AlertDialog.Builder builder = new AlertDialog.Builder(ImageFitScreen.this);
        builder.setTitle("Add Photo!");
        builder.setItems(options, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int item) {
                if (options[item].equals("Take Photo"))
                {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                   File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
                   intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                   startActivityForResult(intent, 1);
                  }
                 else if (options[item].equals("Choose from Gallery"))
                  {
                    Intent intent = new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                   startActivityForResult(intent, 2);
                   }
                   else if (options[item].equals("Cancel")) {
                   dialog.dismiss();
                   finish();
                   }
                   }
                     });
        builder.setOnKeyListener(new Dialog.OnKeyListener() {

        @Override
        public boolean onKey(DialogInterface dialog, int keyCode,
                KeyEvent event) {
            // TODO Auto-generated method stub
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                finish();
                dialog.dismiss();
            }
            return true;
        }
    });
        builder.show();

    }
person Fabin Paul    schedule 03.11.2015
comment
Но как насчет того, если я хочу сделать что-то вроде WhatsApp? Это позволит нам выбрать изображение из галереи. Как только изображение выбрано, оно будет отображаться в полноэкранном режиме и может добавлять подпись. - person Hoo; 03.11.2015
comment
Да, братан, это то, что я ищу. Но когда я нажимаю cancel в диалоговом окне, отображается ImageFitScreen вместо Project1.java - person Hoo; 03.11.2015
comment
Братан, ты всегда можешь использовать finish() для завершения действия. :) Я отредактировал свой ответ... - person Fabin Paul; 03.11.2015
comment
как насчет использования кнопки возврата, предоставляемой эмулятором? Нужно ли добавлять public void onBackPressed()? - person Hoo; 03.11.2015
comment
братан, я отредактировал свой ответ. Это один из вариантов. Но я думаю, что пользователь все еще может отменить/отклонить диалоговое окно предупреждения, щелкнув за его пределами. Другое решение - отключить это, добавив код builder.setCancelable(false); - person Fabin Paul; 03.11.2015
comment
или вы можете использовать builder.setCanceledOnTouchOutside(false); - person Fabin Paul; 03.11.2015
comment
Спасибо, братан, это работает как шарм :) Почему захваченное изображение всегда показывает пейзаж? - person Hoo; 03.11.2015
comment
Я предполагаю, что это зависит от устройства, а также от ориентации, с которой вы захватили изображение. Попробуйте другое тестовое устройство. Вы также можете перейти по этой ссылке. Надеюсь вам поможет.. - person Fabin Paul; 03.11.2015
comment
Если пользователь уже в галерее и хочет вернуться, как он может сразу вернуться к Project1.java вместо ImageFitScreen - person Hoo; 03.11.2015
comment
В этом случае результирующий код onActivityResult будет RESULT_CANCELED. В таком случае вы можете просто завершить действие. - person Fabin Paul; 03.11.2015
comment
Вы имели в виду onActivityResult в ImageFitScreen? - person Hoo; 03.11.2015