반응형

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

 

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

 

토스트(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를 확인해보겠습니다.

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

 

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

 

감사합니다.

반응형
반응형

오늘 뉴스를 보는데.. 비트코인 이야기가 나오더라.

내가 아는 지인은 예전에 비트코인을 샀다가 크게 손해를 봤었다.

좋은것 같지만 나에게 나가오는 느낌의 비트코인은... 좀.... 그렇다.

그래서 기사를 읽는데...

오~~ 테슬라의 한마디에 비트코인이.. 4만 4000달러(약 4932만원)을 돌파했다고 한다.

비트코인만 본다면 상당히 매력있는 화폐이다.

어쩌면 우리가 지금 쓰는 화폐도 종이가 있을 뿐이지 그저 가상화폐랑 다르지 않다고 본다.

근데.. 나는 아직까지는 불안하다.

내가 테슬라처럼 선두주자가 되지 못하는 이유는.. 아마도 그걸 사고 난 후..

가격이 그때그때 틀려지는 것을 불안해서 보기 어려워서 그러는건 아닐까 한다.

우리가 사용하는 지폐처럼 믿을수 있다면.. 아주 좋은 화폐일 수도 있다.

통화란 믿음이 있어야지.. 가치가 있는 것 같다.

지금 울집 밖에 있는 돌에게 천원의 가치가 있어!!! 라고 말해봤자

누가 그걸 천원의 가치가 있는 돌이라고 봐줄까?

재력이 있는 사람들은 그 돌을 가져오면 천원을 줄꺼니깐 돌을 나에게 가져와라~~

라고 한다면 그 돌은 천원의 가치를 갖게 되지만, 천원을 주지 못하면 그건 그저 길바닥에 있는 돌일뿐이다.

나도 선두주자가 되고싶다..

 

 

테슬라 “비트코인 1조원 넘게 투자”...이 말에 비트코인 4932만원 돌파

테슬라가 15억 달러(약 1조 6815억원) 어치의 비트코인을 매입했다고 미 CNBC방송, 블룸버그 통신 등이 8일(현지 시각) 보도했다. 외신에 따르면, 테슬라는 이날 이 같은 내용이 담긴 자료를 미국증

news.naver.com

 

반응형
반응형

 

개요

스피너는 값 집합에서 하나의 값을 선택할 수 있는 빠른 방법을 제공합니다. 기본 상태의 스피너는 현재 선택된 값을 표시합니다. 스피너를 터치하면 기타 모든 사용 가능한 값을 포함하는 드롭다운 메뉴가 표시되며, 여기서 새 값을 선택할 수 있습니다.

Spinner 객체를 사용하여 레이아웃에 스피너를 추가할 수 있습니다. 이 작업은 일반적으로 XML 레이아웃에서 <Spinner> 요소를 사용하여 실행해야 합니다. 예:

 

<Spinner
    android:id="@+id/planets_spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

 

선택 항목 목록으로 스피너를 채우려면 Activity 또는 Fragment 소스 코드에 SpinnerAdapter를 지정해야 합니다.

주요 클래스는 다음과 같습니다.

사용자 선택 항목으로 스피너 채우기

스피너에 제공하는 선택 항목은 어떠한 소스에서든 가져올 수 있지만, SpinnerAdapter를 통해 제공되어야 합니다. 예를 들어 선택 항목을 배열에서 사용할 수 있는 경우에는 ArrayAdapter, 선택 항목을 데이터베이스 쿼리에서 사용할 수 있는 경우에는 CursorAdapter를 통해 제공합니다.

예를 들어, 스피너에 사용할 수 있는 선택 항목이 사전 결정된 경우에는 문자열 리소스 파일에 정의된 문자열 배열을 사용하여 이러한 선택 항목을 제공할 수 있습니다.

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
        <item>Jupiter</item>
        <item>Saturn</item>
        <item>Uranus</item>
        <item>Neptune</item>
    </string-array>
</resources>

이러한 배열과 함께 Activity 또는 Fragment에 다음 코드를 사용하여 ArrayAdapter의 인스턴스를 통해 스피너에 이러한 배열을 제공할 수 있습니다.

 

createFromResource() 메서드를 사용하면 문자열 배열에서 ArrayAdapter를 생성할 수 있습니다. 이 메서드의 세 번째 인수는 선택된 항목이 스피너 컨트롤에 나타나는 방식을 정의하는 레이아웃 리소스입니다. simple_spinner_item 레이아웃은 플랫폼에서 제공하며 스피너의 모양에 관해 자체적인 레이아웃을 직접 정의하고자 하지 않을 경우 사용해야 하는 기본 레이아웃입니다.

그런 다음, setDropDownViewResource(int)를 호출하여 어댑터가 스피너 선택 항목의 목록을 표시하는 데 사용해야 하는 레이아웃을 지정해야 합니다(simple_spinner_dropdown_item은 플랫폼에서 정의하는 또 다른 표준 레이아웃임).

setAdapter()를 호출하여 어댑터를 Spinner에 적용합니다.

 

사용자 선택에 응답

사용자가 드롭다운에서 항목을 선택하면 Spinner 객체가 항목 선택 시 이벤트를 수신합니다.

스피너에 관한 선택 이벤트 핸들러를 정의하려면 AdapterView.OnItemSelectedListener 인터페이스와 이에 상응하는 onItemSelected() 콜백 메서드를 구현합니다. 예를 들어, 다음은 Activity의 인터페이스 구현입니다.

public class SpinnerActivity extends Activity implements OnItemSelectedListener {
    ...

    public void onItemSelected(AdapterView<?> parent, View view,
            int pos, long id) {
        // An item was selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos)
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
    }
}

AdapterView.OnItemSelectedListener에는 onItemSelected() onNothingSelected() 콜백 메서드가 필요합니다.

그런 후 setOnItemSelectedListener()를 호출하여 인터페이스 구현을 지정해야 합니다.

 

Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(this);

 

Activity 또는 Fragment를 사용하여 AdapterView.OnItemSelectedListener 인터페이스를 구현하는 경우(위의 예시 참조) this를 인터페이스 인스턴스로 전달하면 됩니다.

 

 

adapter나 리스너 구현이해가 어렵다면 다음 라이브러리와 같은 오픈소스를 사용하셔도 좋습니다.

github.com/arcadefire/nice-spinner

 

arcadefire/nice-spinner

A nice spinner for Android. Contribute to arcadefire/nice-spinner development by creating an account on GitHub.

github.com

 

참고: developer.android.com/guide/topics/ui/controls/spinner?hl=ko

 

반응형

+ Recent posts