web-dev-qa-db-ja.com

新しいADTがデフォルトで静的内部クラスFragmentを作成するのはなぜですか?

正直なところ、これは新参者を混乱させるためだけに行われていると感じざるを得ません。完全なスタックオーバーフローのエラーのほとんどAndroid初心者は、ほとんどの場合、静的内部クラスFragmentがあり、その仕組み、なぜそこにあるのか、そしてアクティビティを使用しようとしていないことが原因です。彼らは何が起こっているかの背後にある概念を完全には理解していませんが。

認めざるを得ません。 "PlaceholderFragment"のアプローチも理解できず、静的内部クラスの使用はまったく拡張できません。あなたがしなければならない最初のことは、実際のクラスを外部で作成することです-しかし、なぜ初心者がそれをしなければならないのですか?

次のような単純なフラグメントベースのAndroidプロジェクト構造:

  • src
    • 全体パッケージ名
      • アクティビティ
        • 主な活動
      • 断片
        • FirstFragment
        • SecondFragment
  • res
    • レイアウト
    • ...

のコードで

src/wholepackagename/activity/MainActivity:

public class MainActivity extends FragmentActivity implements FirstFragment.Callback
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener()
        {
            public void onBackStackChanged()
            {
                int backCount = getSupportFragmentManager().getBackStackEntryCount();
                if (backCount == 0)
                {
                    finish();
                }
            }
        });

        if (savedInstanceState == null)
        {
            getSupportFragmentManager().beginTransaction().add(R.id.main_container, new FirstFragment()).addToBackStack(null).commit();
        }
    }

    @Override
    public void firstFragmentCallback()
    {
        getSupportFragmentManager().beginTransaction().replace(R.id.main_container, new SecondFragment()).addToBackStack(null).commit();
    }
} 

src/wholepackagename/fragment/FirstFragment.Java:

public class FirstFragment extends Fragment implements View.OnClickListener
{
    private Callback callback;

    private Button firstFragmentButton;

    public static interface Callback
    {
        void firstFragmentCallback();
    }

    public FirstFragment()
    {
        super();
    }

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        try
        {
            callback = (Callback) activity;
        }
        catch (ClassCastException e)
        {
            Log.e(getClass().getSimpleName(), activity.getClass().getSimpleName() + " must implement Callback interface!", e);
            throw e;
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_first, container, false);
        firstFragmentButton = (Button) rootView.findViewById(R.id.fragment_first_button);
        firstFragmentButton.setOnClickListener(this);
        return rootView;
    }

    @Override
    public void onClick(View v)
    {
        if(v == firstFragmentButton)
        {
            callback.firstFragmentCallback();
        }
    };
}

src/wholepackagename/fragment/SecondFragment.Java:

public class SecondFragment extends Fragment implements View.OnClickListener
{
    private Button secondFragmentButton;

    public SecondFragment()
    {
        super();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_second, container, false);
        secondFragmentButton = (Button) rootView.findViewById(R.id.fragment_second_button);
        secondFragmentButton.setOnClickListener(this);
        return rootView;
    }

    @Override
    public void onClick(View v)
    {
        if(v == secondFragmentButton)
        {
            Toast.makeText(getActivity(), "This is an example!", Toast.LENGTH_LONG).show();
        }
    };
}

Android-Manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="wholepackagename"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk
        Android:minSdkVersion="8"
        Android:targetSdkVersion="19" />
    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name="wholepackagename.activity.MainActivity"
            Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

res/layout/activity_main.xml:

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/main_container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

res/layout/fragment_first.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <Button
        Android:id="@+id/fragment_first_button"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true" 
        Android:text="@string/first_button" />

</RelativeLayout>

res/layout/fragment_second.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <Button
        Android:id="@+id/fragment_second_button"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:text="@string/second_button" />

</RelativeLayout>

res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Application name</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="first_button">First Button</string>
    <string name="second_button">Second Button</string>
</resources>



私にとって、静的内部クラスFragmentは実際にはどのような保守性もサポートしていないようで、何が起こっているのかを理解することは困難であり、全体的な機能はActivityおよびFragment(フラグメントとロジック)が混在しているため、初心者が見たり監督したりすることが難しくなります。

Androidプラットフォームで上記の例を使用すると、開発が容易になります。現在のアプローチには、静的内部クラスをフラグメントとして提供するという利点がありますか?

8
Zhuinden

私と他の人々は、あなたの感情を共有します フラグメントはかなり奇妙です で、盲目的にGood Things™として受け入れられるべきではありません。

bootstrapコードでのそれらの存在の背後にある意図は、フラグメントをできるだけ早く開発者の顔の前に投げることであると常に思っていました。フラグメントがバージョン1から存在していないので、Googleが彼らはより多くの人々を参加させるために彼らの紹介にいくらか重みを置く必要がありました、しかし私は推測することができるだけです。

1
David Cowden