Tại sao ADT mới tạo một lớp bên trong tĩnh theo mặc định?


8

Thành thật mà nói, tôi không thể không cảm thấy rằng điều này được thực hiện chỉ để gây nhầm lẫn cho người mới. Hầu hết các lỗi trên Stack Overflow bởi những người mới hoàn thành Android hầu hết đều xuất phát từ việc họ có một lớp bên trong tĩnh mà họ không hiểu cách thức hoạt động của nó, tại sao lại ở đó và cố gắng sử dụng Hoạt động mặc dù họ không hiểu đầy đủ về khái niệm đằng sau những gì đang xảy ra.

Tôi phải thừa nhận, tôi cũng gặp khó khăn khi hiểu cách tiếp cận "PlaceholderFragment" và việc sử dụng các lớp bên trong tĩnh thực sự không thể mở rộng được. Điều đầu tiên bạn phải làm là tạo một lớp học thực sự bên ngoài - nhưng tại sao người mới phải làm điều đó?

Tôi nghĩ rằng điều này có thể hiệu quả hơn nhiều nếu họ sử dụng một cấu trúc dự án tương tự như cấu trúc dự án Android dựa trên đoạn đơn giản sau đây:

  • src
    • wholepackagename
      • Hoạt động
        • Hoạt động chính
      • miếng
        • Đầu tiên
        • Thứ hai
  • độ phân giải
    • bố trí
    • giá trị
    • ...

Với mã của

src / wholepackagename / hoạt động / 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 / value / chuỗi.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>



Đối với tôi, dường như lớp Fragment bên trong tĩnh không thực sự hỗ trợ bất kỳ loại bảo trì nào, thật khó để biết điều gì đang xảy ra và chức năng tổng thể không rõ ràng vì Activity và Fragment (hiển thị đoạn và logic) trộn lẫn với nhau, điều này khiến bạn khó nhìn thấy và giám sát một người mới.

Tôi tin rằng nó sẽ cung cấp một mục nhập dễ dàng hơn để phát triển cho nền tảng Android để có một ví dụ như trên. Có bất kỳ lợi ích nào cho cách tiếp cận hiện tại, cung cấp một lớp bên trong tĩnh như một Mảnh vỡ không?


2
Đã hỏi điều này với bản thân mình ngày hôm qua
Mirco

Câu trả lời:


1

Tôi và những người khác chia sẻ cảm nghĩ của bạn rằng Fragment khá kỳ lạ và không nên chấp nhận một cách mù quáng là Good Things ™.

Tôi luôn nghĩ rằng ý định đằng sau sự tồn tại của họ trong mã bootstrap là ném mảnh vỡ trước mặt các nhà phát triển càng sớm càng tốt. Vì các mảnh vỡ không xuất hiện kể từ phiên bản 1, tôi tưởng tượng Google cảm thấy họ cần đặt một số trọng lượng phía sau phần giới thiệu của mình để có thêm nhiều người tham gia. Nhưng, tôi chỉ có thể suy đoán.


WTFs/min = 2^fragment count angle.sapesup.com/2014/10/ từ
Lovis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.