2013-03-01 12 views
15

Mam problem z oknem wyskakującym. Chcę utworzyć okno wyskakujące z własnym układem. Jest to kod:Ustaw własny układ w oknie wyskakującym w Androidzie

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); 
    } 
} 

i jest to układ, który chcę ustawić w moim okienko:

<?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> 

W mojej klasie nie mogę używać findbyid metody, ponieważ to nie jest aktywny. Jak mogę ustawić swój własny układ w okienku wdowy w mojej klasie?

Edit: to stos ślad gdzie ja dostać błędzie:

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) 

Edit Aktywny które wykorzystują okienko:

@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); 

} 

Odpowiedz

20

wypróbować ten kod:

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, p.x + OFFSET_X, p.y + 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(); 
     } 
     }); 

} 
+1

przydatne, dziękuję! 'wyczyść domyślną przezroczystą warstwę tła, która prowadziła mnie do ściany (zwłaszcza nie znajdując tego, co powodowało to w moim układzie) – YvesLeBorg

1

Hi sprawdzić ten post składa spełnia wszystkie Twoje pytania

Spróbuj tego kodu:

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); 
    } 
} 
+0

I don; t chcesz to zrobić w działalności. Chcę mieć własną kontrolę, która rozszerza PopUpWindow – user1302569

4

Można użyć 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); 
+0

Użyłem twojego rozwiązania, ale dostaję błąd: java.lang.IllegalStateException: Określone dziecko ma już rodzica. Najpierw musisz wywołać metodę removeView() na rodzicu dziecka. – user1302569

+0

Wygląda na to, że jak na wyjątek próbujesz dodać widok, który już został dodany do innego układu, czy mógłbyś wybrać, w której linii otrzymujesz ten wyjątek? – Waqas

+0

Nie możesz debugować i zobaczyć, w której konkretnej linii blokuje ten błąd? Ze śledzenia stosu, otrzymujesz ten błąd wewnątrz metody preparePopup – Waqas

5

Można użyć następującego kodu. do tego celu należy użyć PopupWindow.

PopupWindow mpopup; 

Następnie należy zawyżać swój widok.

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 

jeśli twój układ ma jakiś przedmiot, musisz powiązać go z widokiem.

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

onClickListener elementu okna podręcznego.

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

Można odwołać swój PopupWindow użyciu mpopup.dismiss();

1

spróbować tego ......

public void popUpWindow() { 
    final Dialog dialog = new Dialog(MainActivity.this); 
    dialog.setContentView(R.layout.client_details); 
    dialog.setTitle("Client Details"); 
    dialog.show(); 
} 
0
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(); 
     } 
+0

Ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http: //meta.stackexchange .com/questions/114762/explanining-fully-code-based-answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. –

Powiązane problemy