// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/FlatTransparent" {
	Properties{
		_Color("Main Color", Color) = (1,1,1,1)
		_MainTex("Base (RGB) Trans (A)", 2D) = "white" {}
	}

		SubShader{
			Tags{ "Queue" = "Transparent" "IgnoreProjector" = "False" "RenderType" = "Transparent" }

			/////////////////////////////////////////////////////////
			/// First Pass
			/////////////////////////////////////////////////////////

			Pass {
		// Only render alpha channel
		ColorMask A
		Blend SrcAlpha OneMinusSrcAlpha

		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag

		fixed4 _Color;

		float4 vert(float4 vertex : POSITION) : SV_POSITION {
			return UnityObjectToClipPos(vertex);
		}

		fixed4 frag() : SV_Target {
			return _Color;
		}

		ENDCG
	}

		/////////////////////////////////////////////////////////
		/// Second Pass
		/////////////////////////////////////////////////////////

		Pass {
			// Now render color channel
			ColorMask RGB
			Blend SrcAlpha OneMinusSrcAlpha

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			sampler2D _MainTex;
			fixed4 _Color;

			struct appdata {
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f {
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			v2f vert(appdata v) {
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			fixed4 frag(v2f i) : SV_Target{
				fixed4 col = _Color * tex2D(_MainTex, i.uv);
				return col;
			}
			ENDCG
		}
	}

		Fallback "Diffuse"
}

 

출처: answers.unity.com/questions/290333/transparent-solid-color-shader.html

안드로이드 스튜디오 34.1 기준으로 작성 

BommonVaigationView 생성

프로젝트 생성시

프로젝트 생성시 Bottom Navigation Activity 를 선택

Activity 추가시

New > Activity > Bottom Navigation Activity 선택

 

...더보기

기존 액티비티에 추가 할 때

containers > BottomNavigationView 를 끌어다넣는다 그러면 라이브러리가 필요하다고 나오는데 OK를 눌러주자 
Menu item을 슥슥 추가하고 id , icon을 적절하게 넣어준다
추가한 메뉴를 추가해준

 

MissingConstraints 에러가 나고있던것은 레이아웃에서 적절히 잡아주고 background 를 넣어주면 메뉴가 나타난다 
public class MainActivity extends AppCompatActivity {

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.item1:
                    return true;
                case R.id.item2:
                    return true;
                case R.id.item3:
                    return true;
            }
            return false;
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BottomNavigationView navView = findViewById(R.id.nav_view);
        navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    }
}

activity에서 이벤트 리스너를 추가해준다.

 

Fragment 생성 

New > Fragment > Fragment (Blank) 로 Fragment 를 생성 
간단한 fragment 를 만듬으로 include fragment factory method와 include interface callback 체크를 풀어준다 

 

각 fragment 레이아웃을 알아볼수있게 적당히 배경색을 바꾼다 

 

BottomNavigation 이벤트를 통해 Fragment 변경

처음만든 레이아웃에 프래그먼트출력을위해 컨테이너를 만들자 예시를 위해 fragment_container를 대충 넣었지만 저런짓은 하지말자 

public class MainActivity extends AppCompatActivity {
    Fragment menu1Fragment;
    Fragment menu2Fragment;
    Fragment menu3Fragment;

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,menu1Fragment).commit();
                    return true;
                case R.id.navigation_dashboard:
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,menu2Fragment).commit();
                    return true;
                case R.id.navigation_notifications:
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,menu3Fragment).commit();
                    return true;
            }
            return false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BottomNavigationView navView = findViewById(R.id.nav_view);
        navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

        menu1Fragment = new Menu1Fragment();
        menu2Fragment = new Menu2Fragment();
        menu3Fragment = new Menu3Fragment();

        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,menu1Fragment).commit();
    }

}

fragment 생성 후 BottonNavigationView 이벤트에  FragmentManager로 출력될 fragment를 넣어주면 원하는 fragment가 출력된다.

 

 

추가 내용

Fragment layout.xml click 이벤트 이슈

아래와 같이 Fragment layout xml 파일에서 클릭이벤트를 지정하고 해당 메소드를 Fragment Class 파일에 작성하면

 

java.lang.IllegalStateException: Could not find method onClickButton(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatButton with id 'button'

메소드를 찾지 못하는 것을 볼수있다.

<FrameLayout 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"
    android:background="@color/colorAccent"
    tools:context=".Menu1Fragment">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickButton"
        android:text="Button" />

</FrameLayout>

 

Fragment를 생성하는 Activity 쪽에 매소드를 만들면 정상작동이 되지만 좋은방법이 아니므로 

Fragment 클래스에서 View 를 바로 리턴하지말고 View에서 버튼을 찾아 이벤트를 잡아주자.

public class Menu1Fragment extends Fragment {
    
    private View view ;
    private Button button;

    public Menu1Fragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        //return inflater.inflate(R.layout.fragment_menu1, container, false);
        view= inflater.inflate(R.layout.fragment_menu1,container,false);
        button= view.findViewById(R.id.button);
        button.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View view) {

            }
        });
        return view;
    }
    
}

참고 : https://ljs93kr.tistory.com/4

        https://wimir-dev.tistory.com/13

 

 

 

 

 

xml을 파싱을 하다보면 노드 사이에 공백을 텍스트 노드로 인식하여  #text 노드가 생성이되는데 

아래와 같이 처리를 해주자.

if (node.getNodeType() == Node.ELEMENT_NODE) {
   	//
}

if(node.getNodeType() == Node.TEXT_NODE){
	//
}

 

출처:https://stackoverflow.com/questions/4650878/how-to-remove-text-from-my-node-parsing-in-java-dom-xml-parsing

'부스러기 > Java' 카테고리의 다른 글

Static 키워드  (0) 2017.06.12
이클립스 Dex Loader] Unable to execute dex: GC overhead limit exceeded  (0) 2014.12.06
JAVA mysql 사용  (0) 2013.07.12

+ Recent posts