Establecer el diseño propio en la ventana emergente de android

Tengo un problema con la ventana emergente. Quiero crear una ventana emergente con mi propio diseño. Este es el código:

public class PopupWindowView extends PopupWindow{ PopupWindow popup; boolean click = true; LayoutParams params; RelativeLayout mainLayout; TextView tv; LinearLayout layout; ImageView chooseFlag; public void createPopupWindow(Activity act){ popup = new PopupWindow(act); chooseFlag = (ImageView) act.findViewById(R.id.login_choose_flag); mainLayout = (RelativeLayout) act.findViewById(R.id.login_layout); tv = new TextView(act); layout = new LinearLayout(act); //layout = (LinearLayout) findViewById(R.id.popuplayout); chooseFlag.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (click) { int[] values = new int[2]; v.getLocationOnScreen(values); popup.showAtLocation(mainLayout, Gravity.NO_GRAVITY, 10, 10); popup.update(values[0], values[1], 300, 80); click = false; } else { popup.dismiss(); click = true; } } }); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layout.setOrientation(LinearLayout.VERTICAL); tv.setText("Hi this is a sample text for popup window"); layout.addView(tv, params); popup.setContentView(layout); } } 

Y este es el diseño que quiero establecer en mi ventana emergente:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/popuplayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/patient_button_bg"> </LinearLayout> </LinearLayout> 

En mi clase no puedo usar el método findbyid porque esto no es Actividad. ¿Cómo puedo configurar mi propio diseño en viuda emergente en mi clase?

Editar: este es el rastro de la pila donde me sale error:

 03-01 09:48:48.761: E/AndroidRuntime(16776): FATAL EXCEPTION: main 03-01 09:48:48.761: E/AndroidRuntime(16776): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.ViewGroup.addViewInner(ViewGroup.java:3337) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.ViewGroup.addView(ViewGroup.java:3208) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.ViewGroup.addView(ViewGroup.java:3188) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.widget.PopupWindow.preparePopup(PopupWindow.java:969) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:840) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:813) 03-01 09:48:48.761: E/AndroidRuntime(16776): at pl.asseco.amms.mobile.tools.PopupWindowView$1.onClick(PopupWindowView.java:44) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.View.performClick(View.java:3558) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.view.View$PerformClick.run(View.java:14152) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.os.Handler.handleCallback(Handler.java:605) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.os.Handler.dispatchMessage(Handler.java:92) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.os.Looper.loop(Looper.java:137) 03-01 09:48:48.761: E/AndroidRuntime(16776): at android.app.ActivityThread.main(ActivityThread.java:4514) 03-01 09:48:48.761: E/AndroidRuntime(16776): at java.lang.reflect.Method.invokeNative(Native Method) 03-01 09:48:48.761: E/AndroidRuntime(16776): at java.lang.reflect.Method.invoke(Method.java:511) 03-01 09:48:48.761: E/AndroidRuntime(16776): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 03-01 09:48:48.761: E/AndroidRuntime(16776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 03-01 09:48:48.761: E/AndroidRuntime(16776): at dalvik.system.NativeStart.main(Native Method) 

Editar actividad que utiliza popup:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); getActionBar().hide(); mainMenuGenerator = new MainMenuGenerator(); mainMenuGenerator.generateMainMenu(this); mainMenuGenerator.hideIcons(); popup = new PopupWindowView(); popup.createPopupWindow(this); } 

Prueba este código:

 private void showSortPopup(final Activity context, Point p) { // Inflate the popup_layout.xml LinearLayout viewGroup = (LinearLayout) context.findViewById(R.id.llSortChangePopup); LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = layoutInflater.inflate(R.layout.sort_popup_layout, viewGroup); // Creating the PopupWindow changeSortPopUp = new PopupWindow(context); changeSortPopUp.setContentView(layout); changeSortPopUp.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT); changeSortPopUp.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT); changeSortPopUp.setFocusable(true); // Some offset to align the popup a bit to the left, and a bit down, relative to button's position. int OFFSET_X = -20; int OFFSET_Y = 95; // Clear the default translucent background changeSortPopUp.setBackgroundDrawable(new BitmapDrawable()); // Displaying the popup at the specified location, + offsets. changeSortPopUp.showAtLocation(layout, Gravity.NO_GRAVITY, px + OFFSET_X, py + OFFSET_Y); // Getting a reference to Close button, and close the popup when clicked. Button close = (Button) layout.findViewById(R.id.close); close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { changeSortPopUp.dismiss(); } }); } 

Puede utilizar el siguiente código. Usted necesita usar PopupWindow para esto.

 PopupWindow mpopup; 

Entonces usted necesita para inflar su punto de vista.

  View popUpView = getLayoutInflater().inflate(R.layout.activity_login, null); // inflating popup layout mpopup = new PopupWindow(popUpView, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, true); // Creation of popup mpopup.setAnimationStyle(android.R.style.Animation_Dialog); mpopup.showAtLocation(popUpView, Gravity.CENTER, 0, 0); // Displaying popup 

Si su disposición tiene un cierto artículo entonces usted necesita atar ese artículo con su opinión.

  TextView some = (TextView) popUpView.findViewById(R.id.some); Button btnCancel = (Button) popUpView.findViewById(R.id.btnCancel); 

OnClickListener de su elemento de ventana emergente.

  btnCancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mpopup.dismiss(); } }); 

Puedes descartar tu PopupWindow usando mpopup.dismiss();

Puede utilizar LayoutInflater

 LayoutInflater inflater = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.custom_layout, null); //custom_layout is your xml file which contains popuplayout LinearLayout layout = (LinearLayout) view.findViewById(R.id.popuplayout); 

Hola, compruebe que este mensaje consiste en una solución a su pregunta

Pruebe este código:

 public class ShowPopUp extends Activity { PopupWindow popUp; LinearLayout layout; TextView tv; LayoutParams params; LinearLayout mainLayout; Button but; boolean click = true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); popUp = new PopupWindow(this); layout = new LinearLayout(this); mainLayout = new LinearLayout(this); tv = new TextView(this); but = new Button(this); but.setText("Click Me"); but.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (click) { popUp.showAtLocation(mainLayout, Gravity.BOTTOM, 10, 10); popUp.update(50, 50, 300, 80); click = false; } else { popUp.dismiss(); click = true; } } }); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layout.setOrientation(LinearLayout.VERTICAL); tv.setText("Hi this is a sample text for popup window"); layout.addView(tv, params); popUp.setContentView(layout); // popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10); mainLayout.addView(but, params); setContentView(mainLayout); } } 

prueba esto……

 public void popUpWindow() { final Dialog dialog = new Dialog(MainActivity.this); dialog.setContentView(R.layout.client_details); dialog.setTitle("Client Details"); dialog.show(); } 
  alert=(Button)findViewById(R.id.click); detail=(ImageView)findViewById(R.id.goDetail); alert.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // custom dialog final Dialog dialog = new Dialog(context); dialog.setContentView(R.layout.custom); dialog.setTitle(Html.fromHtml("<font color='#EC407A'>About</font>")); Button dialogButton = (Button) dialog.findViewById(R.id.dialogOK); ImageView img = (ImageView) dialog.findViewById(R.id.goDetail); // if button is clicked, close the custom dialog dialogButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); Toast.makeText(getApplicationContext(),"Dismissed..!!",Toast.LENGTH_SHORT).show(); } }); img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { i=new Intent(getApplication(),CustomDetail.class); setIntent(i); Toast.makeText(Dashboard.this, "Check detail ", Toast.LENGTH_SHORT).show(); } }); dialog.show(); } 
  • Manera correcta de implementar onMeasure () y onLayout () en AdapterView personalizado
  • Problemas de diseño en diferentes pantallas
  • Cómo deshabilitar el clic de WebView?
  • Color del texto del botón AlertDialog con la biblioteca de soporte v24.2.1
  • RecyclerView con elementos de contenido de ajuste
  • ¿Cuál es la diferencia entre getLayoutInflator y (LayoutInflater) getSystemService (Context.LAYOUT_INFLATER_SERVICE)
  • Cómo crear un diseño genérico de Android XML para todas las actividades
  • Diferencia entre android: y app: prefix en Android XML?
  • Cómo desplazarse por programación a la parte inferior de una vista de reciclaje?
  • ¿Qué evento se desencadena después de que todas las vistas están completamente dibujadas?
  • Android: Elementos secundarios que comparten estado presionado con sus padres incluso cuando se especifica duplicateParentState
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.