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
- Hoạt động
- wholepackagename
- độ 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?