반응형

안녕하세요. 애드소프트입니다.

 

오늘은 안드로이드 개발을 하다보면 많은 액티비티(Activity)를 새롭게 호출할때가 많습니다.

 

액티비티에 대해 간단히 알아 보도록 하겠습니다.

액티비티의 개념은 화면에 표시되는 UI구성을 위해 가장 기본이 되는 요소입니다. 안드로이드 앱은

화면에 UI를 표시하기 위해 최소하나 이상의 Activity를 가져야합니다.

앱 실행시 AndroidManifest.xml을 통해 최초 실행될 Activity를 지정할 수도 있습니다.

간단히 설정하자면 현재 화면상에 표시되는 활성화된 창이라고 할 수 있습니다.

 

액티비티의 상태 변화 라이프 사이클은 다음과 같이 표시됩니다.

타원은 상태를 표시하며, 직사각형은 상태를 변경하기 위한 콜백 함수를 표시합니다.

 

출저 : 구글 Developer

 

오늘은 이 Activity를 표시하거나 종료하는 방법을 알아볼까 합니다.

 

Activity를 호출하기 위해서는 다음 두 함수를 이용합니다.

1. startActivity - 액티비티를 호출 할때 사용합니다.

2. startActivityForResult - 액티비티가 시작 될때 코드값를 전송합니다.

 

다음 함수는 Intent를 통해 제공됩니다.

 

Activity를 활성화 하기 위한 간단한 코드를 작성해 보겠습니다.

Intent newIntent = new Intent(context, JavaActivityClass.class);

//key = 문자열키, value = 문자열 값 입력
intent.puExtra(key, value);

startActivity(intent);

파라미터를 받는 쪽에서는 다음과 같이 구현됩니다.

Intent intent = getIntent();
String value = intent.getExtras().getString("key");

 

startActivityForResult를 사용하여 새로운 Activity를 사용한다면 다음과 같이 사용하시면 됩니다.

Intent newIntent = new Intent(context, JavaActivityClass.class);
startActivityForResult(intent, newIntent, requestCode.LOGIN_RESULT);

코드를 사용하기위해서는 다음 함수를 구현 하시면 됩니다.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	super.onActivity(requestCode, resultCode, data);
    case RequestCode.LOGIN_RESULT:
    	if(resultCode == RESULT_OK && !data) {
        	//로그인 성공시
        }else if(requestCode == RESULT_CANCELED) {
        	// 로그인 결과가 CANCEL 할 때 할일
        }
        break;
      default:
        break;
}

본 예제들은 가상으로 코딩한 내용입니다. 오타와 문법이 조금씩 다를 수 있는점 가만해 주세요 ^^;

본 예제는 새로운 Activity를 실행하면서 두가지 방법으로 간단한 결과나 파라미터를 전송하는 방법을 구현한 내용입니다.

 

 

 

 

 

 

 

 

 

반응형
반응형

안녕하세요. 애드소프트 입니다.

오늘은 LinearLayout을 소개해 볼까 합니다.

 

안드로이드 앱을 만들려면 레이아웃을 기반으로 위젯을 배치해 개발을 하게 됩니다.

제일 기본이 되는 레이아웃 중 사용하기도 편하고 설정할 것이 많지 않아 간단하게 

배치할때 사용하게 됩니다.

 

LinearLayout은 가로또는 세로의 단일 방향으로 정렬을 해주는 스택 방식의 뷰 그룹입니다.

정렬 방향은 android:origentation 속성을 사용하여 레이아웃 방향을 지정할 수 있습니다.

 

분홍색 처럼 가로로 배열 하거나 연두색 처럼 세로로 정렬하여야 할 때 많이 사용됩니다.

위젯을 균등하게 분할 할때도 유용하게 사용하 실 수 있습니다.

균등하게 분할하기 위해서는 

layout_width나 layout_height를 0dp또는 wrap_content 속성을 주어야합니다.

android:layout_weight 속성에 모두 1을 설정하면 위젯을 수에따라 균등하게 분할 됩니다.

 

다음 예제를 통해 확인해 보시기 바랍니다.

<?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"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:orientation="vertical" >
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/btn1" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:hint="@string/btn2" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="@string/btn3" />
</LinearLayout>

 

위와같이 코딩을 하시면 다음과 같이 배치가 될 것입니다.

글자 크기와 보더는 다르지만 정렬 방식만 참고하세요.

 

반응형
반응형

안녕하세요. 애드소프트 입니다.

 

오늘은 토스트 사용법에 대해 알아 보겠습니다.

 

토스트(Toast)는 사용자에게 짧은 메시지 형식으로 팝업과 비슷한 형태의 오버레이 창에 메시지를 표시합니다.

메시지 전달을 위해 사용하고 일정시간 지나면 자동으로 사라집니다. 쉽게 말해 단순한 의사전달 팝업 정도로 이해하시면 될 것 같습니다.

 

android developer 발췌

 

 

Toast(토스트) 사용하기

 

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        TextView content;
        public ViewHolder(View view) {
            super(view);

            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast alertToast = Toast.makeText(view.getContext(), getContentTextView().getText(), Toast.LENGTH_SHORT );
                    alertToast.show();
                }
            });

            title = view.findViewById(R.id.item_tv_title);
            content = view.findViewById(R.id.item_tv_content);
        }

        public TextView getContentTextView() {
            return content;
        }
    }

 

상단 예제는 RecylerView의 아이템을 눌렀을 경우 토스트 메시지를 표시하는 샘플 코드입니다.

 

이 예는 대부분의 토스트 메시지 알림에 필요한 모든 것을 보여주며, 이 외에 필요한 것은 거의 없습니다. 그러나 토스트 메시지의 위치를 다르게 지정하거나 단순한 SMS 대신 자체 레이아웃을 사용하는 것이 좋습니다.

 

토스트 메시지 위치 지정

toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);

위치를 오른쪽으로 살짝 이동하려면 두 번째 매개변수의 값을 올리고, 아래로 조금 이동하려면 마지막 매개변수의 값을 올립니다.

 

맞춤 토스트 메시지 뷰 만들기

단순한 텍스트 메시지로 충분하지 않다면 토스트 메시지 알림용으로 맞춤설정된 레이아웃을 만들 수 있습니다. 맞춤 레이아웃을 만들려면 XML 또는 애플리케이션 코드에 뷰 레이아웃을 정의하고 루트 View 객체를 setView(View) 메서드에 전달합니다.

다음 스니펫에는 토스트 메시지 알림용으로 맞춤설정된 레이아웃이 포함되어 있습니다(layout/custom_toast.xml로 저장됨).

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/custom_toast_container"
              android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:padding="8dp"
              android:background="#DAAA"
              >
    <ImageView android:src="@drawable/droid"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_marginRight="8dp"
               />
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textColor="#FFF"
              />
</LinearLayout>

LinearLayout 요소의 ID는 'custom_toast_container'임을 확인하세요. 다음과 같이 이 ID와 XML 레이아웃 파일 'custom_toast'의 ID를 사용하여 레이아웃을 확장해야 합니다.

 

LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast,
                (ViewGroup) findViewById(R.id.custom_toast_container));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("This is a custom toast");

Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();

 

먼저 getLayoutInflater()(또는 getSystemService())를 사용하여 LayoutInflater를 가져온 다음 inflate(int, ViewGroup)

사용하여 XML에서 레이아웃을 확장합니다.

첫 번째 매개변수는 레이아웃 리소스 ID이고 두 번째는 루트 뷰입니다.

이 확장된 레이아웃을 사용하여 레이아웃에서 더 많은 뷰 객체를 찾을 수 있으므로 이제 ImageView와 TextView 요소의 콘텐츠를 캡처하고 정의할 수 있습니다.

마지막으로 Toast(Context)를 사용하여 새 토스트 메시지를 만들고 토스트 메시지의 일부 속성(예: 중력 및 지속 시간)을 설정합니다.

그런 다음 setView(View)를 호출하고 확장된 레이아웃을 전달합니다.

이제 show()를 호출하여 맞춤 레이아웃으로 토스트 메시지를 표시할 수 있습니다.

 

참고 : developer.android.com/guide/topics/ui/notifiers/toasts

반응형
반응형

안녕하세요. 애드소프트 입니다.

Visual studio를 주로 사용하면서 마이크로소프트 솔루션을 많이 이용하여 연동하는데

특별한 공을 들이는 경우가 적었습니다.

이번에 개인적으로 웹사이트를 개발할려고 하다보니 상용 RDBMS인 MSSQL이 설치비와 유지비가 

생각보다 많다고 느껴 오픈 RDBMS를 찾다가 MariaDB를 사용해 보게되었습니다.

 

연동이 어려운것은 아니지만 시행 착오를 격게되어 다른 분들도 생각하고 계시다면

도움이 될거 같아 포스팅해 봅니다.

 

Microsoft에서 제공하는 Entity Framework에 Code First라는 기능을 제공하는데요.

다 아시겠지만 이기능을 이용하면 DB를 수동으로 작성하지 않아도 자동으로 Scheme랑 Data부분을 

등록 수정 할 수 있답니다.

 

서두가 길었습니다.

간단하게 사용방법을 알아보도록 하겠습니다.

처음 접하는 분이시라면 Microsoft Docs에 잘 설명되어 있으니 한번 사용해 보세요.

새 데이터베이스에 Code First-EF6 | Microsoft Docs

 

새 데이터베이스에 Code First-EF6

Entity Framework 6에서 새 데이터베이스에 Code First

docs.microsoft.com

프로젝트 생성 

새로운 프로젝트를 만들도록 하겠습니다.

Visual Studio 2019 기준입니다. 참고하세요^^

Visual Studio를 실행하여 "새 프로젝트 만들기(N)" 메뉴를 선택합니다.

프로젝트 형식에서 웹을 선택하거나 검색을 이용하여 다음 항목을 찾아 프로젝트를 생성하여 줍니다.

 

프로젝트 명을 입력하고 프로젝트가 생성될 경로를 설정하도 만들기 버튼을 눌러줍니다.

 

MVC를 이용하기 때문에 MVC를 선택했고 인증을 이용하기 위해 인증부분을 SQL를 이용하도록 선택하였습니다.

외부인증도 제공하니 개별사용자인증을 이용하도록 하겠습니다.

프로젝트가 생성되었습니다.

 

Code First를 이용하기 위해 DB를 설치해야합니다.

Download MariaDB Products & Tools | MariaDB

 

Download MariaDB Products & Tools | MariaDB

Download the latest versions of MariaDB Platform, MariaDB Community Server, Cloud Database (SkySQL), ColumnStore and MaxScale.

mariadb.com

위 사이트에서 MariaDB Community Server를 다운받아 설치하면 됩니다.

추가로 Connector도 하나 설치해 주세요. 다음 경로에서 다운받아 설치하시면 됩니다.

MySQL :: Download Connector/NET

 

MySQL :: Download Connector/NET

MySQL Connector/NET 8.0 is highly recommended for use with MySQL Server 8.0, 5.7 and 5.6. Please upgrade to MySQL Connector/NET 8.0.

dev.mysql.com

설치 방법은 시간상 생략하도록 하겠습니다.

 

 

마지막으로 Nuget Packeage 관리자를 이용하여 "Mysql.Data.Entity"를 찾아 설치해 줍니다.

 

시간이 걸리니 잠시 기다려 주세요. 설치가 시작되면 다음과 같이 팝업창을 보실 수 있습니다.

확인을 눌러주세요

설치는 모두 완료 되었습니다. 설정부분을 보도록 하겠습니다.

 

설치가 완료되었다면 솔루션 탐색기 상의 Web.config 내용을 살펴 봅시다.

 

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-CodeFirstForMariaDB-20210324111441.mdf;Initial Catalog=aspnet-CodeFirstForMariaDB-20210324111441;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
  
  ...
  
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>

위 내용으로 기본 설정되어 있는데 이부분을 MariaDB로 설정을 변경해야 합니다.

MariaDB는 MySQL이 Oracle로 상용화 되면서 파생된 오픈 소스로 알고 있는데 자세한 내용은 구글을 이용하시면 좋을거 같아요. 이 말씀을 드리는 이유는 설정시에 MySQL이라는 이름을 자주 보게 될 것입니다.

 

Models 폴더의 IdentityModels의  내용과 비교해보면 연동관계를 아실 수 있습니다.

 

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }

 

web.config에 등록된 DefaultConnection에 설정된 DB연동 정보와 IdentityModels의 DefaultConnection의 Scheme가 연동되는것을 알 수 있습니다.

 

web.config의 다음 부분을 

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-CodeFirstForMariaDB-20210324111441.mdf;Initial Catalog=aspnet-CodeFirstForMariaDB-20210324111441;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  ...

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

다음과 같이 수정해 줍니다.

  <connectionStrings>
    <add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;userid={사용자ID};password={패스워드};database={기본DB};persistsecurityinfo=True" />
  </connectionStrings>  
  
  ...
  
   <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </providers>
  </entityFramework>

 

중요한 것은 connection string의 name 부분과 model의 base에 들어 있는 DefaultConnection이 일치해야합니다.

Models - IdentityModels.cs 파일을 다음과 같이 수정합니다.

 

using System.Data.Entity;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
//add using
using MySql.Data.Entity;

namespace CodeFirstForMariaDB.Models
{
    // ApplicationUser 클래스에 더 많은 속성을 추가하여 사용자의 프로필 데이터를 추가할 수 있습니다. 자세한 내용은 https://go.microsoft.com/fwlink/?LinkID=317594를 참조하세요.
    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // authenticationType은 CookieAuthenticationOptions.AuthenticationType에 정의된 항목과 일치해야 합니다.
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // 여기에 사용자 지정 사용자 클레임 추가
            return userIdentity;
        }
    }

    //add type
    [DbConfigurationType(typeof(MySqlEFConfiguration))]
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
}

 

 

설정 후 패키지 관리자 콘솔을 열어 줍니다. "도구-Nuget 패키지 관리자" 에서 찾을 수 있습니다.

패키지 관리자 명령창에 다음 명령을 입력합니다.

오류가 나서 찾아 봤더니 MySqlConnector가 참조로 등록되지 않아 발생하는 오류이네요.

경로 찾기도 귀찮으니 nuget 패키지로 설치 하도록 하겠습니다.

 

패키지 관리자에 다음 명령어를 입력합니다.

 

Install-Package MySqlConnector

 

설치가 완료되면 다시 Enable-Migragions -Force 를 실행합니다.

Code First가 설정된것을 확인 하실 수 있습니다.

Update-Database 명령을 이용하여 기본 테이블을 업데이트 합니다.

 

이런 오류가 발생한다면 다음과 같이 조치하세요.

Migrations 폴더의 IdentityModels.cs 파일입니다.

        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = true;
        }

 

다시 명령을 실행해 보시면 다음과 같은 결과를 보실 수 있습니다.

 

DB를 확인해보겠습니다.

기본적인 테이블이 생성되었습니다.

 

시간상 사용법은 다음기회에  포스팅하기로 하겠습니다.

 

감사합니다.

반응형

+ Recent posts