반응형

웹서버에 워드프레스 설치후 플러그인 다운로드 에러 발생시


APMsetup를 설치하고 웹서버에 워드프레스를 설치하는 것까지 한 후, 워드프레스에 플러그인을 설치할때 다음과 같은 에러가 나는 경우가 있다.


Downloading install package from http://downloads.wordpress.org/plugin/buddypress.2.4.0.zip…

Download failed. There are no HTTP transports available which can complete the requested request.

Return to Plugin Installer


다음 과정을 통하여 해결해 보도록 합니다.

내 페이지에 접속후 로그인하여 대시보드에 진입한다.

좌측 메뉴의 plugins-Add New를 선택하여 플러그인을 추가해 보도록 합니다.

예제로 Buddypress를 설치해 보도록 합니다. Install now 버튼을 클릭하여 설치합니다.


잉? 그러니까 설치가 안된답니다. 왜죠? 

플러그인을 다운로드 받아 수동으로 설치하는것도 번거롭고, 해결책을 찾아 봅시다.


자주 보는 설정진입방법이 또 등장합니다. APMsetup의 서버환경설정을 들어갑니다.



PHP 확장 탭의 php_curl.dll 파일을 체크하고 저장을 누릅니다.

* 플러그인의 종류에 따라 php_openssl.dll도 활성화 해야 할 수도 있다고 합니다. 미리 선택하실분은 선택하셔도 무방합니다만 제 시스템에서는 php_curl.dll만 활성화 해도 잘 동작하였습니다.


작업 표시줄의 APM의 까만 아이콘을 더블클릭 합니다.


정상 작동중인 Apach와 mysql을 정지 합니다.


완전히 중지가 되면 다시 시작 합니다.

참고 : 완전히 재시작 하기 위해 Apache, Mysql 둘다 재시작 하였지만Apache만 재시작 해도 설정파일 적용이 됩니다. 


여기까지 완료하여 서버가 정상 작동중이 되면 다시 플러그인을 다운받아 봅니다.



이제야 플러그인이 설치가 되네요.


참고

웹호스팅 업체로부터 호스팅을 받는 경우 이와 같은 증상이 발생하는 경우 호스팅 업체에 문의하여 php 확장의 php_curl.dll을 셋팅해 달라고 요청을 하시면 됩니다.



출처: http://wassap.tistory.com/170 [Better than Yesterday!]

출처: http://wassap.tistory.com/170 [Better than Yesterday!]

반응형

'IT기술 관련 > 윈도우' 카테고리의 다른 글

Office 365 관련 용어 정리  (0) 2019.04.16
Right VS Permission  (0) 2019.04.09
NTLM 위험 요소  (0) 2017.11.16
NTLM VS Kerberos 인증  (0) 2017.11.16
Winrm 로그 포워딩 방법  (0) 2017.09.26
반응형

출처: https://blog.preempt.com/the-security-risks-of-ntlm-proceed-with-caution


NTLM (NT LAN Manager)은 Windows 2000을 시작하는 Kerberos로 대체 된 Microsoft의 이전 인증 프로토콜입니다. Microsoft Windows 컴퓨터와 서버간에 계정을 인증하기 위해 Microsoft 엔지니어가 설계 및 구현했습니다. 15 년이 넘는 기간 동안 Windows 배포에 대한 기본 설정이 아니었지만 아직 많이 사용되고 있으며 완전히 포기 된 네트워크를 아직 보지 못했습니다. 사실 최신 버전의 Active Directory에서도 지원됩니다.stormy-proceedcaution.png

네트워크에서 NTLM을 사용하면 쉽게 악용 될 수 있으며 조직이 위반 위험에 처하게됩니다. 이 블로그에서는 NTLM이 위험한 이유와 이러한 위험을 완화 할 수있는 최선의 방법을 논의 할 것입니다. [Preempt가 NTLM을 어떻게 도와 줄 수 있는지 보려면이 비디오를확인하십시오 ]

빠른 재미있는 사실

  • NTLM 이전에는 Microsoft에서 LAN Manager (LM) 인증 프로토콜을 사용했습니다.
  • 프로토콜은 IBM과 함께 Microsoft에서 개발했으며 인터넷이 참신하고 사이버 위협이 무섭지 않은 단순한 시대의 상징이었습니다.
  • LM은 극히 약한 암호화 체계를 사용합니다. 현대 연산 장치의 경우 LM 해시는 일반 텍스트 암호를 보내는 것과 거의 같습니다.
  • NTLM은 1993 년에 Windows NT 3.1에서 도입되었으며 나중에 Windows NT 4.0의 두 번째 버전 (NTLMv2)에서 향상되었습니다.
  • NTLMv2는 암호 강도에 대한 몇 가지 보안 향상 기능이 있지만 그 결함 중 일부는 그대로 남아있었습니다.
  • Windows의 최신 버전에서도 NTLM이 지원됩니다.
  • Active Directory는 기본 NTLM 및 Kerberos 구현에 필요합니다.

NTLM 인증 흐름

NTLM을 사용하면 서버에서 생성 된 임의의 챌린지를 암호화하여 서버에 대한 신원을 증명할 수 있습니다.

그림 1은이 흐름을 보여줍니다.

  1. 사용자 컴퓨터가 서버 연결 요청을 보냅니다 (2 단계).
  2. 서버는 임의의 nonce를 생성하여 사용자가 암호화합니다 (3 단계)
  3. 사용자 시스템은 암호 해시로 논스를 암호화하여 암호에 대한 지식을 증명합니다 (4 단계)
  4. 서버는 자체 SAM 데이터베이스의 데이터를 사용하거나 도메인 컨트롤러에서 유효성 검사를 위해 챌린지 - 응답 쌍을 전달하여 올바른 사용자 암호로 암호화 된 챌린지가 실제로 만들어 졌는지 확인하여 사용자 ID의 유효성을 검사합니다 (5-7 단계의 DC 유효성 검사)

NTLM.png

모든 버전의 NTLM이이 흐름을 사용합니다. 버전 간의 주요 차이점은 NTLMv2에서 클라이언트는 클라이언트 넌스와 타임 스탬프를 포함한다는 것입니다. 이렇게하면 오프라인 재생 공격을 완화하는 데 도움이됩니다.

문제점 및 취약점

이제 정말 흥미로운 것들을 위해서. 당신은 매우 책임있는 관리자라고 해봅시다. 모든 시스템이 패치되었는지 확인하십시오. 네트워크 및 엔드 포인트 보호 솔루션이 있습니다. 물론 LM 및 NTLMv1을 사용하지 않도록 설정하면 더 안전한 NTLMv2 만 허용됩니다.

여기에 문제가 있습니다.

약한 암호화

모든 NTLM 버전은 비교적 약한 암호화 체계를 사용합니다. 나는 약점이 거래 차단기가 아님을 동의하지만 해시를 해킹하고 일반 텍스트 비밀번호를 얻는 것이 상대적으로 더 쉽습니다. 첫째, 해시는 상대적으로 약한 MD4를 기반으로합니다. 둘째, 비록 해시가 전선을 통해 전송되기 전에 소금이 칠해 지더라도 해시가 기계의 메모리에 저장됩니다. 그러나 최악의 문제는 시스템에 인증하기 위해 사용자가 대상에서 챌린지에 응답해야하며, 암호가 오프라인 크래킹에 노출된다는 것입니다. 그냥 최근 한이 문제가 얼마나 심각한 설명하기 위해 게시 된 8 자 모든 암호가 거의 표준 하드웨어보다 하루에 금이 될 수있다.

약한 논스

클라이언트와 서버는 DC의 도움없이 자체적으로 챌린지를 위해 넌스 (nonce)를 생성하고 취약한 넌스 (nonce)를 분배하면 악의적 인 위장이 발생할 수 있습니다. 약한 넌센스를 누가 만들 것인지 묻는 경향이있을 수 있으며 그 대답은 Microsoft입니다. 네, 올바르게 들었습니다. 2011 년에는 Microsoft SMB (Server Message Block) 서버 구현이 nonces에 심각한 보안 문제 가 있음을 발견했습니다 이러한 문제는 수정되었지만 약 20 년 동안 발견되지 않았습니다. 이제 타사 서버 및 NTLM 구현과 관련하여 어떤 일이 벌어지고 있는지 상상해보십시오.

다중 요소 인증 없음 (MFA)

엄격하게 암호 기반 인 NTLM은 스마트 카드 및 기타 다중 요소 인증 솔루션에 대한 효과적인 지원이 부족합니다. 물론, 로그인에 스마트 카드를 활용하고 NTLM으로 인증 할 수 있지만, 다른 사람들이 지적했듯이 이것은 (이전 블로그 게시물 에서 언급했듯이 ) 해시를 전달할 수 있기 때문에 전체 스마트 카드 배포를 다소 조롱 거리가됩니다. NT 해시를 직접 사용하십시오.

NTLM 릴레이

이 모든 것들은 메인 코스 전 애피타이저입니다. NTLM의 가장 중요한 문제는 일반적으로 상호 인증을 제공하지 않는다는 것입니다. 이 문제는 그 자체로 문제가되는 반면, NTLM이 재생 및 중간자 공격에 취약해질 수있는보다 심각한 문제로 이어집니다. 이는 사용자가 NTLM을 통해 서버를 인증 할 때마다 발생할 수 있습니다. 연결을 가로 챌 수 있고 (실제 침입 또는 손상된 시스템을 통해) 사용자가 자격 증명을 사용하여 네트워크의 서버로 원하는 모든 작업을 수행 할 수 있습니다 기본적으로 중계 NTLM cred 공격의 공격 경로는 2001 년 이후 였으며 여전히 많은 공격 대상 입니다.

한 가지 방법은 모든 컴퓨터에서 SMB 서명을 강제하는 것입니다. 그러나이 구성은 네트워크 전체에서 시행하기가 어려우므로 HTTP를 통한 NTLM이 여전히 악용 될 수 있기 때문에 문제를 부분적으로 만 해결할 수 있습니다. 이 NTLM 문제를 사용한 최근의 악용 (다른 문제와 함께)은 Hot Potato입니다 .이 약점을 통해 손님 계정으로 코드를 실행하는 모든 Windows 컴퓨터에서 로컬 관리자 권한을 얻을 수 있습니다. Microsoft가 이러한 취약점에 대해 나열한 완화 방법 중 하나는 네트워크 보안을 유지하는 것이며 이러한 취약점은 네트워크에 이미 심각한 위반이있는 경우에만 악용 될 수 있다고 명시합니다. 오늘날의 "위반 가정"사고 방식으로 이것은 만족스럽지 않습니다.  

올해의 Black Hat 컨퍼런스에서 보안 연구원 인 Hormazd Bilimoria와 Jonathan Brossard는 Internet Explorer (또는 Edge)를 속여 로컬 인트라넷에없는 서버에 인증함으로써 NTLM 릴레이를 사용 하여 인터넷에서 네트워크를 손상시킬 수있는 방법을 보여주었습니다 악성 img 태그를 사용하여 또한 여러 가지 응용 프로그램 (MS 및 타사 모두)에서 모두 사용되어 특정 DLL을 사용하여 문제가 모두 안전하지 않다는 것을 보여주기까지했습니다. 즉, Internet Explorer (또는 Edge)가 기적적으로 패치 된 경우에도 취약한 응용 프로그램이 많이있을 수 있습니다.

결론

NTLM이 위험하다는 메시지를 받았기를 바랍니다. 그리고 조직의 네트워크에서주의해서 (완전히 제한되지는 않지만) 사용해야합니다. 사실, 결함 중 일부는 프로토콜의 가장 깊은 부분에 뿌리를두고 있기 때문에 최신 Windows 버전 중 일부가 패치되기 전까지 패치되지 않습니다. 그렇다면 왜 NTLM은 여전히 ​​주위에 있습니까? 레거시 프로토콜이기 때문에 아무 것도 깨지 않으면 서 네트워크에서 제거하기가 매우 어렵습니다. Microsoft는 NTLM을 제한하기위한 지침 을 제공합니다. 이 가이드에서는 모든 NTLM 트래픽을 감사하고 NTLM을 사용하는 서버와 사용자를 분석 한 다음 NTLM을 제한 한 후 사용을 중단하고 예외로 설정해야하는지 판단합니다.

나중에 블로그에서 NTLM을 제거하는 것이 어려운 이유와 UEBA (User Entity and Behavior Analysis) 솔루션을 사용하여 누가 NTLM을 사용하는지 분석하고 결정하고 네트워크의 위험을 평가하며 NTLM을 줄일 수있는 모든 이유에 대해 논의 할 것입니다 공격 표면.

반응형
반응형

출처: https://msdn.microsoft.com/en-us/library/aa480475.aspx


l  NTLM 단점

1) MD4기반의 약한 암호화

2) 클라이언트와 서버는 DC도움 없이 자체적으로 넌스(nonce)를 생성하는데 취약한 넌스(nonce)를 분배하면 악의적인 위장이 발생

3) 다중인증 요소가 없음 (MFA)

4) NTLM 릴레이 - MS2017-8563

           - 상호 인증이 없기 때문에 발생

           - 모든 컴퓨터에 SMB 서명을 강제로 하면 괜찮지만 모든 네트워크에 구성하기 힘듬

          

l  커버러스가 NTLM 보다 좋은점

1) 상호 인증

2) 위임 지원

 

l  exploitdb.com 취약점 개수

NTLM : 12

Kerberos : 14

 

l  최신 취약점 날짜

NTLM : 2017-7-11

Kerberos : 2017-7-11



NTLM 인증

NTLM은 Windows NT 및 Windows 2000 Server 작업 그룹 환경에서 사용되는 인증 프로토콜입니다. 또한 Windows NT 시스템을 인증해야하는 혼합 된 Windows 2000 Active Directory 도메인 환경에서도 사용됩니다. Windows 2000 Server가 하위 수준의 Windows NT 도메인 컨트롤러가없는 기본 모드로 변환되면 NTLM이 비활성화됩니다. 그런 다음 Kerberos v5가 엔터프라이즈의 기본 인증 프로토콜이됩니다.

NTLM 인증 메커니즘

그림 1은 NTLM 프로토콜을 보여줍니다.

Ff647076.ntlmauthentication (ko-kr, PandP.10) .gif

그림 1. NTLM 챌린지 / 응답 메커니즘

챌린지 / 응답 메커니즘은 다음과 같습니다.

  1. 사용자 요청 액세스 . 사용자가 사용자 자격 증명을 제공하여 클라이언트에 로그온하려고합니다. 로그온하기 전에 클라이언트 컴퓨터는 암호 해시를 캐시하고 암호를 삭제합니다. 클라이언트는 요청과 함께 일반 텍스트로 사용자 이름을 포함하는 요청을 서버로 보냅니다.
  2. 서버가 챌린지 메시지를 보냅니다 . 서버는 challenge 또는 nonce라고하는 16 바이트의 난수를 생성하여 클라이언트에 전송합니다.
  3. 클라이언트가 응답 메시지를 보냅니다 . 클라이언트는 사용자의 암호에서 생성 된 암호 해시를 사용하여 서버가 보낸 챌린지를 암호화합니다. 이 암호화 된 챌린지를 응답 형식으로 서버에 다시 보냅니다.
  4. 서버가 도메인 컨트롤러에 대한 요청 및 응답을 보냅니다 . 서버는 사용자 이름, 원래의 시도 및 응답을 클라이언트 컴퓨터에서 도메인 컨트롤러로 보냅니다.
  5. 도메인 컨트롤러는 사용자 인증을 위해 요청과 응답을 비교합니다 . 도메인 컨트롤러는 사용자의 암호 해시를 가져온 다음이 해시를 사용하여 원래의 챌린지를 암호화합니다. 그런 다음 도메인 컨트롤러는 암호화 된 챌린지를 클라이언트 컴퓨터의 응답과 비교합니다. 일치하는 경우 도메인 컨트롤러는 사용자가 인증되었음을 확인하는 서버를 보냅니다.
  6. 서버가 클라이언트에 응답을 보냅니다 . 유효한 신임장을 가정하면, 서버는 클라이언트가 요청 된 서비스 또는 자원에 대한 액세스 권한을 부여합니다.

Kerberos 인증

Kerberos 인증은 NTLM 인증보다 다음과 같은 이점을 제공합니다.

  • 상호 인증 . 클라이언트가 특정 서버의 특정 서비스와의 인증에 Kerberos v5 프로토콜을 사용하는 경우 Kerberos는 클라이언트가 네트워크의 악의적 인 코드에 의해 서비스가 가장하지 못하도록 보장합니다.
  • 위임 지원 . Kerberos 인증을 사용하여 클라이언트를 인증하는 서버는 해당 클라이언트를 가장하여 클라이언트의 보안 컨텍스트를 사용하여 네트워크 리소스에 액세스 할 수 있습니다.
  • 성능 . Kerberos 인증은 NTLM 인증보다 향상된 성능을 제공합니다.
  • 단순화 된 신뢰 관리 . 여러 도메인이있는 네트워크에는 더 이상 복잡한 일련의 명시 적, 지점 간 신뢰 관계가 필요하지 않습니다.
  • 상호 운용성 . Microsoft의 Kerberos 프로토콜 구현은 IETF (Internet Engineering Task Force)에 권장되는 표준 트랙 사양을 기반으로합니다. 따라서 Windows 2000에서 프로토콜을 구현하면 Kerberos 버전 5가 인증에 사용되는 다른 네트워크와의 상호 운용성을위한 기반이됩니다.

Kerberos 인증 메커니즘

그림 2는 Kerberos 인증 프로토콜의 간단한보기입니다.

Ff647076.kerberosauthentication (ko-kr, PandP.10) .gif

그림 2. Kerberos 인증

클라이언트가 네트워크 서비스에 대해 인증하면 Kerberos v5 프로토콜은 다음 단계를 수행합니다.

  1. 클라이언트가 KDC에서 TGT를 요청합니다 . 사용자가 사용자 자격 증명을 제공하여 클라이언트에 로그온하려고합니다. 클라이언트 컴퓨터의 Kerberos 서비스는 Kerberos 인증 서비스 요청을 KDC (키 배포 센터)로 보냅니다. 요청에는 사용자 이름, 티켓 부여 티켓 (TGT)이 요청 된 서비스 정보 및 사용자의 장기 키 또는 암호를 사용하여 암호화 된 시간 스탬프가 포함됩니다.
    참고     Windows 2000 Server 또는 Windows Server 2003 운영 체제에서 도메인 컨트롤러는 KDC 역할을하며 Active Directory는 보안 계정 데이터베이스를 호스트합니다.
  2. 인증 서비스는 암호화 된 TGT 및 세션 키를 보냅니다 . KDC는 Active Directory에서 사용자의 장기 키 또는 암호를 가져온 다음 요청과 함께 전달 된 시간 스탬프를 암호 해독합니다. 타임 스탬프가 유효하면 사용자는 정품입니다. KDC 인증 서비스는 로그온 세션 키를 만들고 사용자의 장기 키를 사용하여 복사본을 암호화합니다. 그런 다음 인증 서비스는 사용자 정보와 로그온 세션 키가 포함 된 TGT를 만듭니다. 마지막으로 인증 서비스는 자체 키를 사용하여 TGT를 암호화하고 암호화 된 세션 키와 암호화 된 TGT를 클라이언트에 전달합니다.
  3. 클라이언트는 TGT에서 서버 액세스를 요청합니다 . 클라이언트는 장기 세션 키 또는 암호를 사용하여 로그온 세션 키의 암호를 해독하고 로컬로 캐시합니다. 또한 클라이언트는 암호화 된 TGT를 캐시에 저장합니다. 네트워크 서비스에 액세스 할 때 클라이언트는 사용자의 이름, 사용자의 로그온 세션 키를 사용하여 암호화 된 인증 자 메시지, TGT 및 서비스 이름과 같은 정보를 사용하여 KDC 티켓 부여 서비스 (TGS)에 요청을 보냅니다 및 서버)에 액세스 할 수 있습니다.
  4. TGS는 암호화 된 세션 키와 티켓을 보냅니다 . KDC의 TGS는 자체 키를 사용하여 TGT를 암호 해독하고 로그온 세션 키를 추출합니다. 로그온 세션 키를 사용하여 인증 자 메시지 (일반적으로 타임 스탬프)를 암호 해독합니다. 인증 자 메시지가 성공적으로 해독되면 TGS는 TGT에서 사용자 정보를 추출하고 사용자 정보를 사용하여 서비스에 액세스하기위한 서비스 세션 키를 만듭니다. 사용자의 로그온 세션 키를 사용하여 서비스 세션 키의 복사본 하나를 암호화하고 서비스 세션 키와 사용자 정보가 포함 된 서비스 티켓을 만든 다음 서버의 장기 키 (암호)로 서비스 티켓을 암호화합니다. 그런 다음 TGS는 암호화 된 서비스 세션 키와 서비스 티켓을 클라이언트에 보냅니다.
  5. 클라이언트가 서비스 티켓을 보냅니다 . 클라이언트가 서비스에 액세스하면 서버에 요청을 전송합니다. 요청에는 서비스 세션 키와 서비스 티켓을 사용하여 암호화 된 인증 자 메시지 (타임 스탬프)가 포함됩니다.
  6. 서버는 클라이언트 유효성 검증을 위해 암호화 된 시간 소인을 보냅니다 . 서버는 서비스 티켓을 암호 해독하고 서비스 세션 키를 추출합니다. 서비스 세션 키를 사용하여 서버는 인증 자 메시지 (타임 스탬프)를 해독하고 평가합니다. 인증자가 테스트를 통과하면 서버는 서비스 세션 키를 사용하여 인증 자 (타임 스탬프)를 암호화 한 다음 인증자를 다시 클라이언트로 전달합니다. 클라이언트는 타임 스탬프의 암호를 해독하고 원본과 동일한 경우 서비스가 정품이고 클라이언트가 연결을 계속 진행합니다.

Flavor

Baseline

Pros

Cons

NTLMv1

Meant for Win9X, NT 3.51

Libraries available in deprecated version of open source JCIFS

IE and Windows only, very crackable, susceptible to man-in-the-middle attacks, chatty on network

NTLMv2

Meant for NT 4.0 SP4

More secure than NTLMv1.

  • IE and Windows only, not a part of Java 6's implementation of SPNEGO
  • Requires 3rd party libraries (e.g., jespa or VSJ)
  • Chatty on network

Kerberos

Default authentication for Active Directory

  • Included in Java 6 implementation of SPNEGO
  • More secure than NTLMv2
  • Open standard
  • Cross platform (Windows, Linux, Unix)
  • Cross browser (IE, Firefox)
  • Less chatty than NTLM

Client machine must be joined to domain


반응형
반응형


이전 포스트에서 리스트 뷰(ListView)를 만들고

리스트 중 하나의 항목을 클릭하면 해당 데이터를 Toast로 표시하는 예제를 소개했습니다.


이번엔 실제 어플에 좀더 많이 사용되는 예제를 소개합니다.


실제 ListView를 사용하는 어플들을 보면

해당 항목을 오래 눌렀을 때 별도의 메뉴가 팍! 나타나는 것을 보셨을 겁니다.


가장 대표적인 경우가 문자(메세제) 목록 중 하나를 삭제하거나 할 때

해당 목록을 오래 누르고 있으면 메뉴가 팍! 올라와서 선택할 수 있는 것을 말합니다.

많이 사용되겠죠.


Context 메뉴는 이미 이전 포스트에서 소개한 적이 있었습니다.

이를 ListView에 적용해 보도록 하겠습니다.


먼저 동작 결과를 보겠습니다.


스크롤 되는 ListView

  



ListView의 첫번째 항목을 길게 눌러서 Context 메뉴 표시

   



ListView의 세번째 항목을 길게 눌러서 Context 메뉴 표시

   



ListView의 마지막 항목을 길게 눌러서 Context 메뉴 표시

   




소스파일들은 이전 포스트의 아이템 클릭 예제에 몇가지만 추가했습니다.



레이아웃 파일은 이전 포스트와 마찬가지로 ListView 하나입니다. 

 activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="${relativePackage}.${activityClass}" >


    <ListView 

        android:id="@+id/listview"

        android:layout_width="match_parent"

        android:layout_height="200dp"/>


</RelativeLayout>


이번 예제는 Context Menu가 있기에 Menu설계를 위해

res폴더 >> menu폴더 >> menu_listview.xml을 만들었습니다.

(이전 포스트의 Context Menu 참고)


메뉴아이템을 설계하는 XML 리소스를 만듭니다.

(이전 옵션메뉴 포스트의 xml파일을 가져와도 됨)

res폴더 안에 'menu'라는 이름으로 폴더를 만드세요(절대 이름 틀리면 안됨)

만들어진 menu폴더안에 menu_listview.xml 파일을 하나 추가하세요.


메뉴 XML 리소스 파일

 mainmenu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    

    <item android:id="@+id/modify"

        android:title="Modify"/>

    

    <item android:id="@+id/delete"

        android:title="Delete"/>

    

    <item android:id="@+id/info"

        android:title="Info"/>    


</menu>

   


소스 코드는 이전 코드에서 새로 추가만 햇습니다.

이전 예제의 클릭은 당연히 동작하겠죠?


굵은 글씨가 새로 추가된 코드(code) 입니다. 

 MainActivity.java


public class MainActivity extends Activity {

//대량의 문자열 데이터를 저장할 Arraylist 객체 생성

ArrayList<String> mDatas= new ArrayList<String>();

ListView listview; //ListView 참조변수


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//문자열 데이터 ArrayList에 추가

mDatas.add("KOREA");

mDatas.add("CANADA");

mDatas.add("FRANCE");

mDatas.add("MEXICO");

mDatas.add("POLAND");

mDatas.add("SAUDI ARABIA");

//ListView가 보여줄 뷰를 만들어내는 Adapter 객체 생성

//ArrayAdapter : 문자열 데이터들을 적절한 iew로 1:1로 만들어서 List형태로 ListView에 제공하는 객체

//첫번째 파라미터 : Context객체 ->MainActivity가 Context를 상속했기 때문에 this로 제공 가능

//두번째 파라미터 : 문자열 데이터를 보여줄 뷰. ListView에 나열되는 하나의 아이템 단위의 뷰 모양

//세번째 파라미터 : adapter가 뷰로 만들어줄 대량의 데이터들

//본 예제에서는 문자열만 하나씩 보여주면 되기 때문에 두번째 파라미터의 뷰 모먕은 Android 시스템에서 제공하는

//기본 Layout xml 파일을 사용함.

ArrayAdapter adapter= new ArrayAdapter(this, android.R.layout.simple_list_item_1, mDatas);

listview= (ListView)findViewById(R.id.listview);

listview.setAdapter(adapter); //위에 만들어진 Adapter를 ListView에 설정 : xml에서 'entries'속성

//ListView의 아이템 하나가 클릭되는 것을 감지하는 Listener객체 설정 (Button의 OnClickListener와 같은 역할)

listview.setOnItemClickListener(listener);

//ListView를 Context 메뉴로 등록

registerForContextMenu(listview);

}

//Context 메뉴로 등록한 View(여기서는 ListView)가 처음 클릭되어 만들어질 때 호출되는 메소드

@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

// TODO Auto-generated method stub

//res폴더의 menu플더안에 xml로 MenuItem추가하기.

//mainmenu.xml 파일을 java 객체로 인플레이트(inflate)해서 menu객체에 추가

getMenuInflater().inflate(R.menu.menu_listview, menu);

super.onCreateContextMenu(menu, v, menuInfo);

}

//Context 메뉴로 등록한 View(여기서는 ListView)가 클릭되었을 때 자동으로 호출되는 메소드

public boolean onContextItemSelected(MenuItem item) {

//AdapterContextMenuInfo

//AdapterView가 onCreateContextMenu할때의 추가적인 menu 정보를 관리하는 클래스

//ContextMenu로 등록된 AdapterView(여기서는 Listview)의 선택된 항목에 대한 정보를 관리하는 클래스

AdapterContextMenuInfo info= (AdapterContextMenuInfo)item.getMenuInfo();

int index= info.position; //AdapterView안에서 ContextMenu를 보여즈는 항목의 위치

//선택된 ContextMenu의  아이템아이디를 구별하여 원하는 작업 수행

//예제에서는 선택된 ListView의 항목(String 문자열) data와 해당 메뉴이름을 출력함

switch( item.getItemId() ){

case R.id.modify:

Toast.makeText(this, mDatas.get(index)+" Modify", Toast.LENGTH_SHORT).show();

break;

case R.id.delete:

Toast.makeText(this, mDatas.get(index)+" Delete", Toast.LENGTH_SHORT).show();

break;

case R.id.info:

Toast.makeText(this, mDatas.get(index)+" Info", Toast.LENGTH_SHORT).show();

break;

}

return true;

};

//ListView의 아이템 하나가 클릭되는 것을 감지하는 Listener객체 생성 (Button의 OnClickListener와 같은 역할)

OnItemClickListener listener= new OnItemClickListener() {

//ListView의 아이템 중 하나가 클릭될 때 호출되는 메소드

//첫번째 파라미터 : 클릭된 아이템을 보여주고 있는 AdapterView 객체(여기서는 ListView객체)

//두번째 파라미터 : 클릭된 아이템 뷰

//세번째 파라미터 : 클릭된 아이템의 위치(ListView이 첫번째 아이템(가장위쪽)부터 차례대로 0,1,2,3.....)

//네번재 파리미터 : 클릭된 아이템의 아이디(특별한 설정이 없다면 세번째 파라이터인 position과 같은 값)

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

// TODO Auto-generated method stub

//클릭된 아이템의 위치를 이용하여 데이터인 문자열을 Toast로 출력

Toast.makeText(MainActivity.this, mDatas.get(position), Toast.LENGTH_SHORT).show();

}

};

}





출처: http://kitesoft.tistory.com/68 [안드로이드 어플 개발]

반응형

+ Recent posts