1

Я создаю экран для компоновки для своего приложения. У меня есть ScrollView, который содержит RelativeView, который, в свою очередь, содержит две вещи: EditText, где пользователь вводит сообщение, и ImageView, чья видимость включена и выключается в зависимости от того, прикреплено ли изображение статусу или нет. Вот эта часть моего макета XML.Как вызвать onClick и onLongClick of EditText из RelativeLayout

<!-- @dimen/bigGap = 8dp --> 
<ScrollView android:id="@+id/parentScrollView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" 
    android:layout_marginTop="@dimen/bigGap" 
    android:layout_marginRight="@dimen/bigGap" 
    android:layout_marginLeft="@dimen/bigGap" 
    android:layout_marginBottom="@dimen/bigGap" 
    android:layout_above="@+id/footer" 
    android:background="#006400" 
    > <!-- green background color --> 

    <RelativeLayout android:id="@+id/parentLinearLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#FFD700"> <!-- yellow background color --> 

     <EditText android:id="@+id/postText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#dddddd" 
      android:inputType="textMultiLine" 
      android:gravity="top|left" 
      /> <!-- gray background color --> 

     <ImageView android:id="@+id/postImage" 
      android:layout_width="@dimen/thumbnailSize" 
      android:layout_height="@dimen/thumbnailSize" 
      android:visibility="gone" 
      android:layout_below="@id/postText" 
      /> 
    </RelativeLayout> 
</ScrollView> 

Поскольку высота моих EditText «S является wrap_content, все это начинается с одной линией серого фона (EditText) на вершине желтого фона (RelativeLayout, который полностью покрывает зеленый фон из ScrollView). Тем не менее, я позже изменю все фоны представлений на белый (чтобы они выглядели как один компонент), и будет непротиворечиво для пользователя, чтобы он мог использовать только одну строку EditText, чтобы заставить клавиатуру поп вверх.

enter image description here

То, что я хочу сделать, это перенаправить щелчок и длинный клик действия RelativeLayout на клик и долго клик действия EditText, но мой код ниже не работает. Помогите?

final EditText editText = (EditText) findViewById(R.id.postText); 
RelativeLayout rl = (RelativeLayout) findViewById(R.id.parentLinearLayout); 
rl.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Logger.d("onClick invoked!"); 
     editText.performClick(); 
    } 
}); 
rl.setOnLongClickListener(new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(View v) { 
     Logger.d("onLongClick invoked!"); 
     return editText.performLongClick(); 
    } 
}); 

Мое намерение здесь так, что когда RelativeLayout нажата, клавиатура всплывает (как это делает, когда сделано с EditText), и когда долго нажата, отобразить параметры вырезать/копировать/вставить/выбор текста (такое же поведение с EditText).

ответ

1

Из описания, что вы на самом деле хотите открыть клавиатуру. Поэтому ваш заголовок для вопроса предлагает решение, а не настоящую проблему.

называют это от вашей мыши слушателя (или сразу, когда вы показываете страницу):

((InputMethodManager) myActivity 
      .getSystemService(Context.INPUT_METHOD_SERVICE)) 
      .toggleSoftInput(InputMethodManager.SHOW_FORCED, 
        InputMethodManager.HIDE_IMPLICIT_ONLY); 

Edit: Вы должны также вызывать editText.requestFocus(); (@Phil прав), но из моего опыта недостаточно открыть клавиатуру, так что вам понадобится также уродливый код выше.

0

Что вы хотите, чтобы ваш EditText, чтобы получить фокус (который, в свою очередь, вызывает клавиатуру, чтобы показать):

rl.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Logger.d("onClick invoked!"); 
     editText.requestFocus(); 
    } 
}); 
rl.setOnLongClickListener(new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(View v) { 
     Logger.d("onLongClick invoked!"); 
     editText.requestFocus(); 
     return true; 
    } 
});