2011-08-13 48 views
1

私のプログラムは、GoogleのHelloギャラリーの例に基づいています-clicked際ギャラリーでEditTextsは奇妙な挙動を示す:
http://developer.android.com/guide/tutorials/views/hello-gallery.html
の代わりに画像を使用して、私はコンストラクタでEditText Sの束を作成します。Androidの(長い)という

私の質問は今です:EditTextを長くクリックすると、コンテキストメニュー(「すべて選択」、「コピー」など)が表示されます。 (それはところで、私はここに私の質問を掲示した理由だ - [OK]を、1つはお粗末だった。)私はmyGallery.getAdapter().getView(position, ...).showContextMenu()を経由して、選択したビューを呼び出しOnItemLongClickListenerを設定しようとしたが、それはStackOverflowErrorに実行されます。

08-13 16:02:36.062: ERROR/AndroidRuntime(3400): FATAL EXCEPTION: main 
java.lang.StackOverflowError 
at android.widget.AdapterView.getPositionForView(AdapterView.java:581) 
at android.widget.Gallery.showContextMenuForChild(Gallery.java:1049) 
at android.view.View.showContextMenu(View.java:2520) 
at de.test.gallery2.Main$1.onItemLongClick(Main.java:51) 
at android.widget.Gallery.dispatchLongPress(Gallery.java:1074) 
at android.widget.Gallery.showContextMenuForChild(Gallery.java:1055) 

IをまたregisterForContextMenu()Galleryを試してから、EditTextsを入力してください。両方が失敗しました。あなたの誰かが解決策を持っていますか?

Btwでは、ギャラリーにいくつかの奇妙な動作が表示されます。アプリケーションが起動すると、最初のEditTextは中央に配置されますが、タップすると編集できません。しかし、私が2番目のもの(中心にない)をタップすると、それを中央に置かずに編集することができます。私が中心を第2のEditTextの中心に置くと、私は第3のものだけを編集することができます。私が最後のものを中央に置くと、フォーカスは完全に消滅し、もう何も編集することはできません。

あなたが私を助けることができるなら、私はおそらくあなたと結婚します。どんな助けもありがとうございます。そして、私を信じてください - 私はこの質問をする前に多くの研究をしました。本当に。
どうもありがとう

m1ntf4n

EDITここ

は、私の活動のコードです。ダブルポストに申し訳ありません、編集の可能性を考慮に入れなかった。 Googleのドキュメントから

public class Main extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final Gallery gallery = (Gallery) findViewById(R.id.gallery); 
     gallery.setAdapter(new LocalAdapter(this)); 
     gallery.setSpacing(50); 

     registerForContextMenu(gallery); 

     //Register the EditViews for ContextMenu. 
     for(int i = 0; i < gallery.getAdapter().getCount(); ++i) { 
      registerForContextMenu(gallery.getAdapter().getView(i, null, null)); 
     } 

     //This listener will cause a StackOverflowError. 
     /*gallery.setOnItemLongClickListener(new Gallery.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> a, View v, int i, long l) { 
       return gallery.getAdapter().getView(i, null, null).showContextMenu(); 
      } 
     });*/ 
    } 

    public class LocalAdapter extends BaseAdapter { 
     private Context mContext; 
     private EditText[] editText; 

     public LocalAdapter(Context c) { 
      mContext = c; 
      editText = new EditText[5]; 
      for(int i = 0; i != editText.length; ++i) { 
       editText[i] = new EditText(mContext); 
       editText[i].setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
       editText[i].setText("TEXT " + i); 
       editText[i].setTextSize(30); 
      } 
     } 
     @Override 
     public int getCount() { 
      return editText.length; 
     } 
     @Override 
     public Object getItem(int position) { 
      return position; 
     } 
     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      return editText[position]; 
     } 
    } 
} 
+0

スタックトレースの一部を単にポストするのではなく、関連するコードを投稿することもできますか?特に、私はどこでregisterForContextMenu()を呼び出し、どこでonCreateContextMenu()をオーバーライドするかを見たいと思っています。 – glorifiedHacker

+0

ええと、私はonCreateContextMenuをオーバーライドしません。私はこれがギャラリーの中にないEditTextのためではないので、これは必要ではないと考えました。これは問題ですか? – m1ntf4n

+0

それは確かに問題の一部ですが、私はそれがすべての問題であると確信することはできません。私は以下のGoogleの文書から引用を引用して説明しました。 – glorifiedHacker

答えて

2

ます。public void registerForContextMenu(ビュービュー)

は(複数 ビューは、コンテキストメニューを表示することができます)指定されたビューに表示されるコンテキストメニューを登録します。このメソッドは、 onCreateContextMenu(ContextMenu、View、ContextMenuInfo)がコンテキストメニューを表示する時点で と呼ばれるように、このアクティビティのビューに View.OnCreateContextMenuListenerを設定します。

コンテキストメニューが表示される前に、ドキュメントからわかるように、onCreateContextMenu()がメインで呼び出されます。カスタムコンテキストメニューを作成するには、このメソッドをオーバーライドする必要があります。

+0

ありがとう、glorifiedHacker。これは私に以下のように解決策を導いてくれました。 EditTextには独自のonCreateContextMenu()メソッドがあるので、これは表示されませんでしたので、アクティビティの1つをオーバーライドする必要があるとは思いませんでした。 – m1ntf4n

0

ありがとうございます、glorifiedHacker。我々はregisterForContext(myGallery)を必要とし、活動のonCreate()方法で

  1. :あなたは、以下のソリューションに私を導きました。

  2. EditTextを拡張する独自のクラスMyEditTextを作成します。 (コンストラクタを追加した後、もちろん)このクラスでは、アクセス保護法EditText::onCreateContextMenu()行う必要があります戻る活動の

    @Override 
    public void onCreateContextMenu(ContextMenu menu) { 
        super.onCreateContextMenu(menu); 
    } 
    
  3. を、最初の行が取得され

    @Override 
    public void onCreateContextMenu(ContextMenu contextMenu, View v, 
               ContextMenu.ContextMenuInfo menuInfo) 
    { 
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
        ((MyEditText) info.targetView).onCreateContextMenu(contextMenu); 
    } 
    

    を行いますコンテキストメニューを要求しているビュー、もう1つはEditTextの(現在表示されている)onCreateContextMenu()を呼び出しています。したがって、長い押しで、ユーザが使用されているコンテキストメニューが表示されます。

+0

P.S.:EditTextのコンテキストメニューがギャラリー内にないときに自動的に呼び出される方法はまだわかりません。どうやら、ビューはコンテキストメニュー自体を処理することはできますか? – m1ntf4n

関連する問題