2014-11-21 80 views
1

我有以下情况:如何创建虚拟视图锚弹出窗口的Android

private void startConnection() { 
    HashMap<String,String> hm = new HashMap<String,String>(); 
    hm.put("email","[email protected]"); 
    String URL = "192.168.1.2/test.php"; 
    Db_connection db = new Db_connection(hm,URL,context); 
    db.startTest(); 
} 

public class Db_connection { 

    private HashMap<String, String> params; 
    private String URL; 
    private ConnectionController CC; 
    private ToolTip tt; 
    private Context con; 
    private ProgressDialog dialog; 

    public Db_connection(HashMap<String,String> params,String URL,Context con) { 
     this.params = params; 
     this.URL = URL; 
     this.con = con; 
     this.dialog = new ProgressDialog(con); 
     this.dialog.setCancelable(true); 
     this.CC = ConnectionController.getInstance(); 
    } 

    public void startTest() { 
     JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params), 
       new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       if (dialog.isShowing()) { dialog.dismiss(); } 

       if (response != null && response.has("result")) { 
        try { 
         if (!response.getString("result").matches("error")) { 
          Toast.makeText(con, "Response: "+response.getString("result"), Toast.LENGTH_LONG).show(); 
         } 
         else { Toast.makeText(con, response.getString("errmsg"), Toast.LENGTH_LONG).show(); return; } 

         VolleyLog.v("Response:%n %s", response.toString(4)); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       ToolTip tt = new ToolTip(con, error.getMessage()); 
       tt.showNow(); 
       Log.e("Error: ", error.getMessage()); 
      } 
     }); 
     req.setRetryPolicy(rp); 
     CC.addToRequestQueue(req); 
    } 
} 

public class ToolTip { 

private Context con; 
private PopupWindow pn; 
private View layout; 
private ImageView cancel; 
private TextView mess; 

public ToolTip(Context con,String htmlMsg) { 
    this.con = con; 
    LayoutInflater inflater = (LayoutInflater)con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    layout = inflater.inflate(R.layout.tooltip,null); 
    pn = new PopupWindow(layout,LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT,false); 
    pn.setAnimationStyle(R.style.AnimationToolTip); 
    cancel = (ImageView)layout.findViewById(R.id.tooltip_imageClose); 
    mess = (TextView)layout.findViewById(R.id.tooltip_mainText); 
     mess.setText(Html.fromHtml(htmlMsg)); 

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

    public void showNow() { 
     pn.showAtLocation(/*HERE IS WHERE I DON'T KNOW WHAT TO PASS AS VIEW*/((Activity) con).getActionBar().getCustomView(), Gravity.NO_GRAVITY, 0, 180); 
    } 
} 

一切正常,但是当凌空请求抛出一个错误,并使用工具提示类显示错误:

ToolTip tt = new ToolTip(con, error.getMessage()); 
tt.showNow(); 

我得到这个异常:

11-21 15:08:06.390: E/AndroidRuntime(22448): Process: com.tooltip.test, PID: 22448 
11-21 15:08:06.390: E/AndroidRuntime(22448): java.lang.ClassCastException: com.tooltip.test.ConnectionController cannot be cast to android.app.Activity 
11-21 15:08:06.390: E/AndroidRuntime(22448): at com.tooltip.test.ToolTip.showNow(ToolTip.java:46) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at com.tooltip.test.Db_connection$2.onErrorResponse(Db_connection.java:100) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at com.android.volley.Request.deliverError(Request.java:577) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:101) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at android.os.Handler.handleCallback(Handler.java:733) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at android.os.Handler.dispatchMessage(Handler.java:95) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at android.os.Looper.loop(Looper.java:136) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at android.app.ActivityThread.main(ActivityThread.java:5139) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at java.lang.reflect.Method.invokeNative(Native Method) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at java.lang.reflect.Method.invoke(Method.java:515) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
11-21 15:08:06.390: E/AndroidRuntime(22448): at dalvik.system.NativeStart.main(Native Method) 

通常我通过这样的:

((Activity) con).getActionBar().getCustomView() 

的图,该锚弹出窗口和它的作品,但在这种特殊情况下,活动呼叫提示类,没有一个动作条(它是唯一一个,所有其他的活动确实有自定义动作条)。

我在这里问是否有一种方法使用虚拟,程序创建的视图在这种情况下使用。

也许我做错了,你有一个很好的建议:)

在此先感谢

回答

2

经过一番尝试,我终于来到了一个解决方案:我选择用两种不同的方法,一个对于没有操作栏与操作栏,以及一个用于活动活动:

public void showNow() { //THIS IS FOR ACTIVITY WITH ACTION BAR 
    pn.showAtLocation((Activity)con.getActionBar().getCustomView(), Gravity.NO_GRAVITY, 0, 180); 
} 

public void showNowNoActBar() { //THIS IS FOR ACTIVITY WITHOUT ACTION BAR 
    pn.showAtLocation(con.findViewById(R.id.dummy_hidden_view), Gravity.NO_GRAVITY, 0, 180); 
} 

显然R.id.dummy_hidden_view在活动的XML布局定义而不自定义动作条这样的:

<TextView 
    android:id="@+id/dummy_hidden_view" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:visibility="gone" /> 

我认为这两种方法都可以用一种方法解决,但到目前为止,我可以依靠我的“双重方法”解决方案来满足我的需求。希望它可以帮助别人。仍然保持这样的事实,我将不胜感激关于如何处理这一问题的更好建议。