-1

Я знаю, что есть несколько примеров того, как передавать данные из активности в диалог (т. Е. Bundle или Intent). Однако все, что я пробовал, не работает. Я продолжаю получать ошибки NPE и "Unable to find explicit activity class". Даже когда я строю сверхбазисную активность с диалогом, это не работает. Что мне нужно вставить в код, чтобы он работал?Как передать данные из Activity в DialogFragment

MainActivity:

public class MainActivity extends AppCompatActivity { 

    Button button; 
    String textIWantToSee; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    button = (Button) findViewById(R.id.button); 

    textIWantToSee = "If this is the text I want to pass form this activity to the Fragment"; 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


     } 
    }); 
    } 
} 

Диалог:

public class Dialog extends DialogFragment { 

    TextView textView; 

    @Override 
    public android.app.Dialog onCreateDialog(Bundle savedInstanceState) { 

    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View v = inflater.inflate(R.layout.dialog_layout, null); 

    textView = (TextView) v.findViewById(R.id.textView); 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setView(v); 

    return builder.create(); 
    } 
} 

Update

MainActivity:

public class MainActivity extends AppCompatActivity { 

TextView tvIntent; 
Button button; 
String textIWantToSee; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    tvIntent = (TextView) findViewById(R.id.tvIntent); 
    button = (Button) findViewById(R.id.button); 

    textIWantToSee = "If this is the text I want to pass form this activity to the Fragment"; 
    tvIntent.setText(textIWantToSee); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String intent = String.valueOf(tvIntent); 
      Intent intentToDialog = new Intent(MainActivity.this, Dialog.class); 
      intentToDialog.putExtra("keyForIntent", intent); 
      startActivity(intentToDialog); //Here is the exception 

     } 
    }); 
} 

} Диалог:

public class Dialog extends DialogFragment { 

TextView textView; 
String intent; 

@Override 
public android.app.Dialog onCreateDialog(Bundle savedInstanceState) { 

    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View v = inflater.inflate(R.layout.dialog_layout, null); 

    textView = (TextView) v.findViewById(R.id.textView); 
    Intent intentFromDialog = new Intent(getActivity().getApplicationContext(),MainActivity.class); 
    intent = intentFromDialog.getStringExtra("keyForIntent"); 
    textView.setText(intent); 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setView(v); 

    return builder.create(); 
} 

}

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: nl.blogvandetoekomst.passdatafromactivitytodialog, PID: 2947 
       android.content.ActivityNotFoundException: Unable to find explicit activity class {nl.blogvandetoekomst.passdatafromactivitytodialog/nl.blogvandetoekomst.passdatafromactivitytodialog.Dialog}; have you declared this activity in your AndroidManifest.xml? 
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1794) 
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1512) 
        at android.app.Activity.startActivityForResult(Activity.java:3917) 
        at android.app.Activity.startActivityForResult(Activity.java:3877) 
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:842) 
        at android.app.Activity.startActivity(Activity.java:4200) 
        at android.app.Activity.startActivity(Activity.java:4168) 
        at nl.blogvandetoekomst.passdatafromactivitytodialog.MainActivity$1.onClick(MainActivity.java:36) 
        at android.view.View.performClick(View.java:5198) 
        at android.view.View$PerformClick.run(View.java:21147) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="nl.blogvandetoekomst.passdatafromactivitytodialog"> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

+0

Могу ли я спросить, что название вашей деятельности? –

+0

Возможный дубликат: http://stackoverflow.com/questions/15459209/passing-argument-to-dialogfragment – AndroidRuntimeException

+0

У меня есть два класса: 1. MainActivity; 2. Диалог. –

ответ

-1

Вы можете создать диалог непосредственно в деятельности:

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     LayoutInflater inflater = MainActivity.this.getLayoutInflater(); 
     View v = inflater.inflate(R.layout.dialog_layout, null); 

     TextView textView = (TextView) v.findViewById(R.id.textView); 
     textView.setText(textIWantToSee); 

     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
     builder.setView(v); 
     builder.show(); 

     } 
    }); 
+0

Это плохой подход по всем очевидным причинам, «DialogFragment» является рекомендуемым способом. – OBX

+0

Это дает мне «Невозможно разрешить метод getLayoutInflater()», «Variable» v уже определен в области », а Builder (android .content.Context) в Builder не применимо до (анонимно android.view.View.OnClickListener). –

+0

Как называется ваша деятельность? –

0

Если вы используете библиотеку поддержки, вы должны использовать android.support.v4.app.DialogFragment вместо android.app.Dialog. Кроме того, можете ли вы опубликовать часть кода, который вы используете, чтобы показать диалог?

Тогда вы должны использовать рамочное версию DialogFragment как OBX указал:

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    Button button; 
    String textIWantToSee; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     button = (Button) findViewById(R.id.button); 

     textIWantToSee = "If this is the text I want to pass form this activity to the Fragment"; 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Dialog dialogFragment = new Dialog(); 
       Bundle bundle = new Bundle(); 
       bundle.putString("TEXT",textIWantToSee); 
       dialogFragment.setArguments(bundle); 
       dialogFragment.show(getFragmentManager(),"Image Dialog"); 
      } 
     }); 
    } 
} 

Dialog.java

public class Dialog extends DialogFragment { 

    TextView textView; 

    @Override 
    public android.app.Dialog onCreateDialog(Bundle savedInstanceState) { 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View v = inflater.inflate(R.layout.dialog_layout, null); 

     Bundle bundle = getArguments(); 
     String imageLink = bundle.getString("TEXT",""); 

     textView = (TextView) v.findViewById(R.id.textView); 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setView(v); 
     return builder.create(); 
    } 
} 

Таким образом, отлично работает для меня.

EDITED:

Когда вы делаете это в OnClick:

Intent intentToDialog = new Intent(MainActivity.this, Dialog.class); 
intentToDialog.putExtra("keyForIntent", intent); 
startActivity(intentToDialog); //Here is the exception 

Вы не начинать деятельность, Dialog.class является расширенной DialogFragment, вы не можете показать диалог Запуск Мероприятия. Попробуйте последний код, который я опубликовал.

+0

Когда я импортирую его вручную «import android.support.v4.app.FragmentManager;» остается серым. У меня нет специального кода, чтобы показать диалог. Я попробовал как Bundle так и Intent. Что-то вроде: «startActivity (intentToDialog)»; и "new Dialog(). show (getFragmentManager()," dialog ") ;. –

0

Это, как вы передать данные в DialogFragment из Activity:

MainActivity.Java

public class MainActivity extends AppCompatActivity { 

Button button; 
String textIWantToSee; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    button = (Button) findViewById(R.id.button); 

    textIWantToSee = "If this is the text I want to pass form this activity to the Fragment"; 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Dialog dialogFragment = new Dialog(); 
      Bundle bundle = new Bundle(); 
      bundle.putString("TEXT",textIWantToSee); 
      dialogFragment.setArguments(bundle); 
      dialogFragment.show((MainActivity.this).getSupportFragmentManager(),"Image Dialog"); 

     } 
    }); 
} 
} 

Dialog.java

public class Dialog extends DialogFragment { 

TextView textView; 

@Override 
public android.app.Dialog onCreateDialog(Bundle savedInstanceState) { 

    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View v = inflater.inflate(R.layout.dialog_layout, null); 

    Bundle bundle = getArguments(); 
    String imageLink = bundle.getString("TEXT",""); 

    textView = (TextView) v.findViewById(R.id.textView); 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setView(v); 

    return builder.create(); 
} 
} 
+0

Это дает мне представление« Не удается разрешить метод »(android.support.v4.app.FragmentManager, java.lang.String) '" at ((MainActivity.this) .getSupportFragmentManager(), «Диалог изображений») –

+0

какой фрагмент вы используете, фрагмент или фрагмент v4? – OBX

+0

'android.support.v7.app.AlertDialog;' импортирован. Я импортировал 'android.support.v4.app.FragmentManager;' вручную, но этот остается серым. –

0

Ваш диалог фрагмент необходим хостинг деятельности, он должен быть надут внутри деятельности.

Чтобы надуть/показать DialogFragment в вашем использовании MainActivity:

button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Bundle bundle = new Bundle(); //Bundle containing data you are passing to the dialog 
     bundle.putString("text", textIWantToSee); 

     Dialog dialog = new Dialog(); //Create a new Dialog 
     dialog.setArguments(bundle); 

     dialog.show(getSupportFragmentManager(), "MY_DIALOG_TAG"); //Inflate the dialog 
    } 
}); 
0

Использование newInstance Диалог фрагмента. относятся: https://developer.android.com/reference/android/app/DialogFragment.html

static MyDialogFragment newInstance(int num) { 
    MyDialogFragment f = new MyDialogFragment(); 

    // Supply num input as an argument. 
    Bundle args = new Bundle(); 
    args.putInt("num", num); 
    f.setArguments(args); 

    return f; 
} 

Если вы используете Котлин, попробуйте определения newInstance внутри объекта-компаньона

companion object { 
     fun newInstance(num: Int): MyDialogFragment{ 
      val f = DimensionDialogFragment() 
      val args = Bundle() 
      args.putInt("num", num) 
      f.setArguments(args) 

      return f 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^